什么是私有方法Object#select?

时间:2017-02-17 20:42:34

标签: ruby internals

和其他许多人一样,我看到了异常

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);

但是,我不能。

这种方法是什么?

2 个答案:

答案 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#methodMethod#owner来确定方法的来源:

nil.method(:select)
#=> #<Method: NilClass(Kernel)#select>
nil.method(:select).owner
#=> Kernel

所以它是Kernel#select