和其他许多人一样,我看到了异常
private method 'select' called for nil:NilClass (NoMethodError)
去吧。令我感到奇怪的是,它并没有说undefined method 'select' for nil:NilClass (NoMethodError)
。确实有这样一种方法,它是私有的!
这种方法是什么?
我发现它已在Object
上定义,而不只是NilClass
,但它未在BasicObject
上定义。通过使用#send
,我发现它需要1..4个参数。前三个必须是一个数组(或零)。并且最后一个必须可以转换为"时间间隔"。在任何情况下,当它没有抛出参数错误时,它会挂起。
它不在ruby文档中,因为它是私有的。我真的不知道如何阅读C源代码,但我还没有找到任何暗示的东西。我希望看到object.c
;
rb_define_private_method(rb_cObject, "select", select, 0);
但是,我不能。
这种方法是什么?
答案 0 :(得分:2)
这是Kernel#select
。内核模块的每the docs:
内核模块包含在Object类中,因此它的方法在每个Ruby对象中都可用。
如果你好奇select
做了什么:
select(read_array [,write_array [,error_array [,timeout]]])→array或nil
调用select(2)系统调用。它监视给定的
IO
对象数组,等待一个或多个IO
对象准备好读取,准备写入,并分别具有挂起的异常,并返回包含这些IO的数组的数组对象。
您可以在这个问题的答案中阅读更多关于对象包含内核的背景信息:Why does the Ruby module Kernel exist?
答案 1 :(得分:2)
您可以使用Object#method
和Method#owner
来确定方法的来源:
nil.method(:select)
#=> #<Method: NilClass(Kernel)#select>
nil.method(:select).owner
#=> Kernel
所以它是Kernel#select