Array.each do vs Array do - 有什么区别?

时间:2016-09-27 06:24:36

标签: ruby

我无法解释评估第二个代码块的结果(不使用.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]      # <-- ???

我理解:

  1. Array.new(#)使用相应的nil值和
  2. 调用一个数组
  3. 使用.each调用do |i|方法迭代(枚举?)每个索引值(= nil),
  4. p打印该值,
  5. 代码块结束。
  6. 我对如何删除.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配对正在产生某种差异。对此处发生的事情的任何解释都会非常有帮助。谢谢。

2 个答案:

答案 0 :(得分:2)

Array.new(3).each { ... }创建一个大小为3的新数组,并在该数组上调用each

Array.new(3) { ... }创建一个大小为3的数组,并将该块作为第二个参数发送到new方法。当您使用块调用new时,块的返回值将用于初始化数组。

请参阅有关Array#new

的文档

答案 1 :(得分:2)

Documentation说:

new(size=0, default=nil)
new(array)
new(size) {|index| block } 
  

在最后一种形式中,创建了给定大小的数组。通过将元素的索引传递给给定块并存储返回值来创建此数组中的每个元素。

您可以通过纯粹的机会分配您的元素(p返回它打印的值,使其返回块的值,使其成为相应数组元素的值)。如果你使用puts(它总是返回nil),你会得到数组中的nil元素并将0,1,2打印到标准输出,这会增加混乱,我想: )