Ruby 每个带有\u对象的\u的累加器保持重新初始化
我试图编写一个广义笛卡尔积,其中[n1,n2,…ni]的输入数据为所有mj生成一个[m1,m2,…mi]数组的输出数据,因此0我承认我不完全理解这个问题,但我已经解决了一个类似的问题,可以解释为什么Ruby 每个带有\u对象的\u的累加器保持重新初始化,ruby,accumulate,Ruby,Accumulate,我试图编写一个广义笛卡尔积,其中[n1,n2,…ni]的输入数据为所有mj生成一个[m1,m2,…mi]数组的输出数据,因此0我承认我不完全理解这个问题,但我已经解决了一个类似的问题,可以解释为什么v没有被您的代码更新 让我们逐步浏览您的代码,返回所需的结果,而不是一路上显示它 dims = [3,2,4] first = dims.shift #=> 3 dims #=> [2, 4] dims 表情 dims.each_with_object((0...fi
v
没有被您的代码更新
让我们逐步浏览您的代码,返回所需的结果,而不是一路上显示它
dims = [3,2,4]
first = dims.shift
#=> 3
dims
#=> [2, 4] dims
表情
dims.each_with_object((0...first).to_a) do |dim, v|
v.product((0...dim).to_a)
end
实际上与
v = []
dims.each do |dim|
v.product((0...dim).to_a)
end
v #=> []
v
在末尾仍然是一个空数组,这一点并不奇怪,因为v
的值在循环中没有改变。v.product((0…dim).to_a)
的返回值被射出到空间中,再也看不到了。在循环中需要一个赋值语句
现在考虑以下内容:
dims = [3,2,4]
v = []
dims.each do |n|
v << (0...n).to_a
end
v #=> [[0, 1, 2], [0, 1], [0, 1, 2, 3]]
我们可以使用以下方法简化此过程:
根据您的需要,您可能更喜欢使用:
每次迭代都会得到相同的对象,因此您要么需要在块内对对象进行变异,要么使用
reduce
def gcp(dims)
first = dims.shift
dims.reduce((0...first).to_a) do |v, dim|
puts "\nv: #{v}, dim: #{dim}"
p v.product((0...dim).to_a)
end
end
gcp([3,2,4])
结果:
v: [0, 1, 2], dim: 2
[[0, 0], [0, 1], [1, 0], [1, 1], [2, 0], [2, 1]]
v: [[0, 0], [0, 1], [1, 0], [1, 1], [2, 0], [2, 1]], dim: 4
[[[0, 0], 0], [[0, 0], 1], [[0, 0], 2], [[0, 0], 3], [[0, 1], 0], [[0, 1], 1], [[0, 1], 2], [[0, 1], 3], [[1, 0], 0], [[1, 0], 1], [[1, 0], 2], [[1, 0], 3], [[1, 1], 0], [[1, 1], 1], [[1, 1], 2], [[1, 1], 3], [[2, 0], 0], [[2, 0], 1], [[2, 0], 2], [[2, 0], 3], [[2, 1], 0], [[2, 1], 1], [[2, 1], 2], [[2, 1], 3]]
Lori,请告诉我我是否误解了这个问题。所需的输出是MikeWu获得的,或者最终通过
.map(&:flatte)
可以显示p
在第二次迭代中应该显示什么吗?我用v.product((0…dim)to_a)
替换v=v.product时得到了相同的结果((0…dim)。对于a)
,所以我假设变异不同于重新分配。但是reduce
似乎更简单。谢谢。通过“相同的结果”你是指与reduce?Lori相同的结果,reduce
用块中执行的最后一条语句替换v
的值。这是否是产品((0…dim)并不重要.to_a)
或v=v.product((0…dim).to_a)
,因为它们是相等的,所以执行赋值没有意义。使用reduce
和each_with _object
的唯一区别是,您需要使用后者进行赋值。试试吧。别忘了使用这两种方法可以反转块变量的位置。结果与我原来的帖子相同
dims.each_with_object([]) do |n,v|
v << (0...n).to_a
end
#=> [[0, 1, 2], [0, 1], [0, 1, 2, 3]]
dims.map do |n|
(0...n).to_a
end
#=> [[0, 1, 2], [0, 1], [0, 1, 2, 3]]
dims.flat_map do |n|
(0...n).to_a
end
#=> [0, 1, 2, 0, 1, 0, 1, 2, 3]
def gcp(dims)
first = dims.shift
dims.reduce((0...first).to_a) do |v, dim|
puts "\nv: #{v}, dim: #{dim}"
p v.product((0...dim).to_a)
end
end
gcp([3,2,4])
v: [0, 1, 2], dim: 2
[[0, 0], [0, 1], [1, 0], [1, 1], [2, 0], [2, 1]]
v: [[0, 0], [0, 1], [1, 0], [1, 1], [2, 0], [2, 1]], dim: 4
[[[0, 0], 0], [[0, 0], 1], [[0, 0], 2], [[0, 0], 3], [[0, 1], 0], [[0, 1], 1], [[0, 1], 2], [[0, 1], 3], [[1, 0], 0], [[1, 0], 1], [[1, 0], 2], [[1, 0], 3], [[1, 1], 0], [[1, 1], 1], [[1, 1], 2], [[1, 1], 3], [[2, 0], 0], [[2, 0], 1], [[2, 0], 2], [[2, 0], 3], [[2, 1], 0], [[2, 1], 1], [[2, 1], 2], [[2, 1], 3]]