难以输出2D阵列

时间:2012-10-11 00:25:38

标签: ruby class multidimensional-array

我正在解决我需要创建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 个答案:

答案 0 :(得分:1)

您的问题是,您在each上应用了c,这是CartesianProduct的一个实例。您需要each @output。至于如何从外部访问@output,你应该知道;这是一件基本的事情。

答案 1 :(得分:0)

我刚开始使用Ruby,但我认为我找到了原因: 致电c.each { |elt| puts elt.inspect }时 它首先执行您在类中定义的调用。结果是传递给测试{ |elt| puts elt.inspect }中的块的字符串,它们将它们分开在不同的行上。

答案 2 :(得分:0)

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

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

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

现在,您对each的定义puts@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 的每个方法:

{{1}}

答案 3 :(得分:0)

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

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