1

CartesianProductクラスを作成する必要がある問題に取り組んでいます。このクラス 2 リストを渡してから、これらのリストのデカルト積 (すべての可能な組み合わせ) を出力できるはずです。

これまでのところ、このクラスからオブジェクトを作成し、可能なすべての組み合わせを作成できますが、これらの結果を画面に出力しようとすると、配列であることを認識していないかのように、各項目が独自の行に表示されます。

私のコード:

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 = CartesianProduct.new([:a,:b], [4,5])
=> #<CartesianProduct:0x93569f8 @output=[[:a, 4], [:a, 5], [:b, 4], [:b, 5]]>

テストは、次のコマンドで実行されます。c.each { |elt| puts elt.inspect }

私は得る:

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
4

4 に答える 4

1

あなたの問題は、 のインスタンスである に適用eachしていることです。その上で行う必要があります。外部からのアクセス方法については、知っておく必要があります。それは基本的なことです。cCartesianProducteach@output@output

于 2012-10-11T00:46:45.960 に答える
0

クラス内のそれぞれの定義を変更すると、この問題は解決しました。

def each
    @output.map do |x|
        yield x
    end
end
于 2012-10-12T20:49:34.463 に答える
0

私はRubyを始めたばかりですが、原因を見つけたと思います.呼び出すc.each { |elt| puts elt.inspect } と、最初にクラスで定義した呼び出しが実行されます。その結果は、テスト{ |elt| puts elt.inspect }でブロックに渡される文字列であり、それらは別々の行に分割されます。

于 2012-10-11T00:51:49.527 に答える
0

#each in の実装はCartesianProductブロックを受け入れないため、 instance の場合c、 にブロックを渡しc.eachても効果はありません。これを試して:

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

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

これで、各配列に対するeach呼び出しの定義が. 配列を呼び出すと、ネストされた配列 (つまり、フラット化された配列) 内であっても、各要素が反復処理されます。puts@outputputs

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

eachあなたが望むのは、特定のブロックを の each メソッドに渡すの実装だと思います@output

def each(&block)
  @output.each(&block)
end
于 2012-10-11T00:57:06.850 に答える