我想知道空数组中的元素是什么。
我理解在each
上使用块调用Array
会迭代Array
中的每个元素并评估该块。
但这是我感到困惑的地方:
[].each { |e| puts e }
=> []
[].each { |e| puts e.random_method }
=> []
似乎我可以在e
块中调用each
上的任何方法,并且ruby控制台将始终返回[]
。如果e
是nil
,是否应该提出遗漏方法错误?有什么解释吗?
答案 0 :(得分:10)
有几件事你错了。
e
不是nil
。没有e
。 "我没有妻子。我的每个妻子都是太空怪兽。"是真的。该块根本没有评估,因为集合中没有任何内容。 []
是一个空数组,与[nil]
不同,nil
是一个以e
为唯一元素的单元素数组(当nil
确实是{{1}时},e.random_method
会失败)。以这种方式看待:如果[1, 2].each { .... }
执行两次阻止,[1].each { .... }
执行一次,则[].each { .... }
执行零次,而不是nil
执行一次。
each
返回原始数组。 [].each { .... }
返回[]
。 [1, 2, 3].each { .... }
返回[1, 2, 3]
。在那里没有什么可以解决的谜 - 返回值与你的问题无关。您想知道puts
的输出结果是什么 - 而且[]
不是什么。没有puts
的输出,因为它被执行了零次(见上文)。
所以要回答一个名义上的问题 - 空数组中没有任何内容,这就是为什么我们称之为“#34;空”" :)
答案 1 :(得分:0)
检查以下
2.0.0-p598 :001 > [].each { |e| puts e } #Here loop is never get executed because array is blank
=> []
2.0.0-p598 :002 > [nil].each { |e| puts e * e } #here loop is getting executed once but throws an error
NoMethodError: undefined method `*' for nil:NilClass
from (irb):2:in `block in irb_binding'
from (irb):2:in `each'
from (irb):2
from /home/cybage/.rvm/rubies/ruby-2.0.0-p598/bin/irb:12:in `<main>'
2.0.0-p598 :003 > [1].each { |e| puts e * e } #here you can see loop executed once print '1' and then `each` returns the array itself.
=> 1
=> [1]