使用Array#find在Ruby(on Rails)中的奇怪行为

时间:2014-01-27 13:26:42

标签: ruby arrays find block

仔细看看下面的代码:

a = [1,2,3]
n = 2
puts a.find { |i| i == n }
=> 2

a = [1,2,3]
n = [2]
puts a.find { |i| i == n.shift }
=> nil

提示:您可以在此处查看正在运行的版本http://repl.it/OL3

现在解释一下。为什么第二个#find会返回nil

2 个答案:

答案 0 :(得分:4)

因为Array#shift从数组中删除了元素。

因此,第一次执行块时,它正在比较e['name'] == "pets",但在下一次迭代中,它正在比较e['name'] == nil。除非e['name']在第一次迭代时为"pets",否则.find将返回nil

答案 1 :(得分:0)

@Charles Caldwell 正确解释了,为什么你得到了这个结果。现在只需使用以下Array#first方法,这是安全的:

a.find { |i| i == n.first }