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)
有什么不同?
Splat可以在一个级别上工作.有map
,块参数是[0, 1]
等等,可以spalatted 0
和1
.使用inject
,块参数是nil
和[0, 1]
,可以分配给两个变量(没有splat),但不是三个.Splat在这里不起作用,因为它们已经被喷溅(它们是两个变量).为了进行展开[0, 1]
,您需要在数组中执行此操作,这需要一对括号.
{|a, (i, j)| ...}
Run Code Online (Sandbox Code Playgroud)