用于reduce/inject迭代器的Splat块参数

tor*_*o2k 0 ruby iterator block

我已经定义了这样一个数组:

ary = [[0,1], [2,3]]
Run Code Online (Sandbox Code Playgroud)

运行以下代码:

ary.reduce(nil) do |a, i, k|
  puts "#{a.inspect} #{i.inspect} #{k.inspect}"
end
Run Code Online (Sandbox Code Playgroud)

在每次迭代中,我都期望变量a,i并且k分别保持accumulator(nil),第一个元素和内部数组的第二个元素的值,即我期望这个输出:

nil 0 1
nil 2 3
Run Code Online (Sandbox Code Playgroud)

但结果却是:

nil [0, 1] nil
nil [2, 3] nil
Run Code Online (Sandbox Code Playgroud)

为什么?我怎样才能达到我想要的效果?

此外,为什么下面的代码使用map正如我所期望的那样?

ary.map do |i, k|
  puts "#{i.inspect} #{k.inspect}"
end

# Output
# 0 1
# 2 3
Run Code Online (Sandbox Code Playgroud)

有什么不同?

saw*_*awa 5

Splat可以在一个级别上工作.有map,块参数是[0, 1]等等,可以spalatted 01.使用inject,块参数是nil[0, 1],可以分配给两个变量(没有splat),但不是三个.Splat在这里不起作用,因为它们已经被喷溅(它们是两个变量).为了进行展开[0, 1],您需要在数组中执行此操作,这需要一对括号.

{|a, (i, j)| ...}
Run Code Online (Sandbox Code Playgroud)