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