什么是空数组?

时间:2015-03-23 09:05:00

标签: ruby arrays

我想知道空数组中的元素是什么。

我理解在each上使用块调用Array会迭代Array中的每个元素并评估该块。

但这是我感到困惑的地方:

[].each { |e| puts e }
=> []

[].each { |e| puts e.random_method }
=> []

似乎我可以在e块中调用each上的任何方法,并且ruby控制台将始终返回[]。如果enil,是否应该提出遗漏方法错误?有什么解释吗?

2 个答案:

答案 0 :(得分:10)

有几件事你错了。

  1. e不是nil。没有e。 "我没有妻子。我的每个妻子都是太空怪兽。"是真的。该块根本没有评估,因为集合中没有任何内容。 []是一个空数组,与[nil]不同,nil是一个以e为唯一元素的单元素数组(当nil确实是{{1}时},e.random_method会失败)。以这种方式看待:如果[1, 2].each { .... }执行两次阻止,[1].each { .... }执行一次,则[].each { .... }执行零次,而不是nil执行一次。

  2. each返回原始数组。 [].each { .... }返回[][1, 2, 3].each { .... }返回[1, 2, 3]。在那里没有什么可以解决的谜 - 返回值与你的问题无关。您想知道puts的输出结果是什么 - 而且[]不是什么。没有puts的输出,因为它被执行了零次(见上文)。

  3. 所以要回答一个名义上的问题 - 空数组中没有任何内容,这就是为什么我们称之为“#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]