我无法解释评估第二个代码块的结果(不使用.each
)。
Array.new(3).each do |i|; p i; end
# nil
# nil
# nil
#=> [nil, nil, nil]
Array.new(3) do |i|; p i; end
# 0
# 1
# 2
#=> [0, 1, 2] # <-- ???
我理解:
Array.new(#)
使用相应的nil
值和.each
调用do |i|
方法迭代(枚举?)每个索引值(= nil),p
打印该值,我对如何删除.each
方法调用导致Array.new
索引获取指定值感到困惑。
值得注意的是,在显式声明的nil值数组之后,使用相同的do
块生成错误(如果我正确描述它?)
[nil, nil, nil].each do |i|; p i; end
# nil
# nil
# nil
#=> [nil, nil, nil]
[nil, nil, nil] do |i|; p i; end
# SyntaxError: (irb):4: syntax error, unexpected keyword_do_block, expecting end-of-input
# [nil, nil, nil] do |i|; p i; end
# ^
# from C:/Ruby22/bin/irb:11:in `<main>'
我假设do
代码块开始与Array.new
配对正在产生某种差异。对此处发生的事情的任何解释都会非常有帮助。谢谢。
答案 0 :(得分:2)
Array.new(3).each { ... }
创建一个大小为3
的新数组,并在该数组上调用each
。
Array.new(3) { ... }
创建一个大小为3
的数组,并将该块作为第二个参数发送到new
方法。当您使用块调用new
时,块的返回值将用于初始化数组。
请参阅有关Array#new
答案 1 :(得分:2)
new(size=0, default=nil)
new(array)
new(size) {|index| block }
在最后一种形式中,创建了给定大小的数组。通过将元素的索引传递给给定块并存储返回值来创建此数组中的每个元素。
您可以通过纯粹的机会分配您的元素(p
返回它打印的值,使其返回块的值,使其成为相应数组元素的值)。如果你使用puts
(它总是返回nil
),你会得到数组中的nil元素并将0,1,2打印到标准输出,这会增加混乱,我想: )