Ruby 每个带有\u对象的\u的累加器保持重新初始化

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

我试图编写一个广义笛卡尔积,其中[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...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]]