Array#的块参数首先做什么?

时间:2016-09-13 17:51:20

标签: ruby

我的记忆力最差,我忘了Array#find

所以我编写了一些代码,使用Array#first来获得匹配条件的第一个项目:

first_even_num = [1,2,3].first { |x| x % 2 == 0 }

这不起作用,它只返回数组的第一个元素,无论条件是什么。根本没有调用该块:

[1,2,3].first { |x| exit }
puts "the program did not exit"

我已经接受Array#first并没有想象它,但我很好奇为什么上述例子不会引起错误。

查看2.3.1源,唯一记录的参数是一个表示返回结果数的整数。

我真的不知道C,但这是基础Array#first方法作为参数签名的原因:

rb_ary_first(int argc, VALUE *argv, VALUE ary)

我只是想知道为什么提供给Array#first的块如果什么都不做就不会引发错误。

3 个答案:

答案 0 :(得分:7)

您可以将块传递给任何方法,绝对是任何方法。如果它不需要块,它就不会使用它。这不是错误(因为块不是参数之一。它是方法的单独输入)

答案 1 :(得分:2)

有一些关于Ruby和块的简单规则。

  1. 您可以将块传递给任何方法。

  2. 该方法可以选择在从现在到遥远的未来的任何时间点运行零次或多次

  3. 您必须阅读文档或方法实现,以了解是否,如何以及何时执行块。没有别的方法可以了解。

  4. 此处将块传递给不期望的方法的示例与这些规则一致。实际上,它运行零次并且与{{1}}呼叫的结果无关。

答案 2 :(得分:0)

你可以通过做下面的事情得到结果。

def get_first_even(arr)
if arr.first % 2 == 0
    first_even_num = arr.first
    puts first_even_num
else
    arr.delete_at 0
    get_first_even arr
end
end

get_first_even [1,3,5,7,9,23,13,14,11,12]