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]

我的输出不是打印symbolsas 符号而是转换为字符串,并将每个项目打印在自己的行上......

这是家庭作业,所以我不是在寻找答案,但是朝着正确的方向轻推会很有帮助。

编辑 =================================================== ======================= 更改我each在课堂上的定义解决了这个问题。

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

4 回答 4

1

您的问题是您正在申请eachc这是CartesianProduct. 你需要做each的就@output可以了。至于如何@output从外部访问,你应该知道;这是一件基本的事情。

于 2012-10-11T00:46:45.960 回答
0

我刚开始使用 Ruby,但我想我找到了原因:当你调用c.each { |elt| puts elt.inspect } 它时,首先执行你在类中定义的调用。其结果是传递给测试中的块的字符串,该块{ |elt| puts elt.inspect }将它们拆分为单独的行。

于 2012-10-11T00:51:49.527 回答
0

您的 #each inCartesianProduct实现不接受块,因此,对于 instance c,将块传递给c.each无效。试试这个:

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

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

现在,eachputs@output. 调用puts数组将遍历每个元素,甚至在嵌套数组中(换句话说,数组的扁平化版本):

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

我相信您想要的是each将给定块传递给每个方法的实现@output

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

更改我对班级中每个人的定义解决了这个问题。

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