2012-10-11 4 views
1

CartesianProduct 클래스를 생성해야하는 문제에 대해 작업하고 있습니다. 이 클래스 2 목록을 전달한 다음이 목록의 카디 전 곱 (모든 가능한 조합)을 출력 할 수 있어야합니다.2D 배열을 출력하기가 어려움

지금까지이 클래스에서 개체를 만들 수있는 모든 가능한 조합을 만들 수 있지만 이러한 결과를 화면에 출력하려고하면 각 항목이 자체 행에있는 것처럼 배열로 인식됩니다.

내 코드 :

class CartesianProduct 
    include Enumerable 
    # Your code here 
    def initialize(a,b) 
     @output = [] 
     a.each do |x| 
      b.each do |y| 
       if !(output.include? [x,y]) 
        output << [x,y] 
       end 
      end 
     end 
    end 

    #getter 
    def output 
     @output 
    end 

    def each 
     @output.each do |a| puts a end 
    end 

    #setter 
    def output=(a,b) 
     a.each do |x| 
      b.each do |y| 
       if !(output.include? [a,b]) 
        output << [a,b] 
       end 
      end 
     end 
    end 
end 

무엇 임 테스트에 사용 : 내가 얻을 c.each { |elt| puts elt.inspect }

: 테스트는 다음 명령을 통해 이루어집니다

c = CartesianProduct.new([:a,:b], [4,5]) 
=> #<CartesianProduct:0x93569f8 @output=[[:a, 4], [:a, 5], [:b, 4], [:b, 5]]> 

irb(main):1403:0> c.each { |elt| puts elt.inspect } 
a 
4 
a 
5 
b 
4 
b 
5 
=> [[:a, 4], [:a, 5], [:b, 4], [:b, 5]] 

하지만 나 점점해야합니다

# [:a, 4] 
# [:a, 5] 
# [:b, 4] 
# [:b, 5] 

내 출력 상징으로 symbols을 인쇄하는 것이 아니라 문자열로 변환하고 인쇄 한 줄에 각 항목 ...

이 숙제, 그래서 난하지 않습니다 대답을 찾는 것이 아니라 올바른 방향으로 조금 움직이면 도움이 될 것입니다.

편집 =========================================== =============== 클래스에서 each의 정의를 변경하면이 문제가 해결되었습니다.

def each 
    @output.map do |x| 
     yield x 
    end 
end 

답변

0

클래스의 각 정의를 변경하면이 문제가 해결됩니다.

def each 
    @output.map do |x| 
     yield x 
    end 
end 
1

귀하의 문제는 당신이 CartesianProduct의 인스턴스 인, ceach을 적용하고 있다는 점이다. 그 중 을 @output에해야합니다. 외부에서 @output에 액세스하는 방법은 알아야합니다. 그것은 기본적인 것입니다.

+0

내 클래스에 'each'를 정의 했는데도? 내가 이것을했을 때'c.each '라고 불렀을 때'@ output'을 참조하는 나의 메소드를 사용할 것이라고 생각했다. – ProfessionalAmateur

+0

좋아요, 이제 당신이하는 일을 볼 수 있습니다. 어느 쪽이든 1)'each '에 대한 정의를 꺼내고'each'를 할 때'@ output'을 호출하십시오. 그 정의는 매우 이상합니다. 또는 2)'each '를 정의하는 것을 주장하면, 거기서'inspect'를 사용해야하고,'each'를 부를 때는'c.each' 만 있으면됩니다. – sawa

+0

정말 기괴하고 새로운 Ruby 사용자입니다. :) 제가 각각을 꺼내어 시험을하면, 모든 것이 1 줄로 나옵니다. – ProfessionalAmateur

0

방금 ​​Ruby를 시작했지만 원인을 찾았습니다. c.each { |elt| puts elt.inspect } 을 호출하면 먼저 클래스에 정의 된 호출이 실행됩니다. 결과는 블록 { |elt| puts elt.inspect }에있는 블록으로 전달되는 문자열로 별도의 줄로 분할됩니다.

+0

이것을 닫으려면 질문 답변으로 표시하십시오. – sunnyrjuneja

0

CartesianProduct에서 #each를 구현 한 경우 블록을 허용하지 않으므로 c 인스턴스의 경우 c.each으로 블록을 전달해도 아무런 효과가 없습니다. 이 시도 :

c.each { |elt| raise "an error!" } 

# no error is raised because the block is not called. 

지금, each의 당신의 정의는 @output의 배열의 각 puts를 호출합니다.배열에 puts를 호출하면 (즉 배열의 평평 버전)도 중첩 배열 내에서 각 요소를 반복합니다

ruby-1.9.3-p125 :006 > puts [1,2,[3,4]] 
1 
2 
3 
4 
=> nil 

을 나는 당신이 원하는 것은 주어진 블록을 통과 each의 구현입니다 생각 @output의 각 방법 :