ruby中定义的method_missing在哪里

时间:2013-12-11 07:38:35

标签: ruby

我使用ruby-1.9.3。

method_missing method到来时,我试图找出这个方法的定义。 我看一下Ruby Doc,发现该方法是在BasicObject中定义的, 但是当我在irb中使用BasicObject.methods.grep /^method/时,它给了我一个没有任何method_missing方法的结果数组,然后,我尝试Kernel.methods.grep /^method/,但仍然没有method_missing方法。

你能帮助我吗?我在哪里可以找到这种方法?

4 个答案:

答案 0 :(得分:8)

使用Method#owner知道在哪个类中定义了哪个方法。

method(:method_missing).owner # => BasicObject

答案 1 :(得分:6)

这是一种私人方法: 尝试:

BasicObject.private_methods.grep /missing/

答案 2 :(得分:2)

如果你想看到来源,你将不得不在C代码(用于MRI)中挖掘,例如使用gem install pry pry-doc即可

~$ pry
[1] pry(main)> show-source method_missing

From: vm_eval.c (C Method):
Owner: BasicObject
Visibility: private
Number of lines: 7

static VALUE
rb_method_missing(int argc, const VALUE *argv, VALUE obj)
{
    rb_thread_t *th = GET_THREAD();
    raise_method_missing(th, argc, argv, obj, th->method_missing_reason);
    UNREACHABLE;
}

答案 3 :(得分:0)

如果其他人正在阅读一些旧材料并感到困惑,这种方法显然习惯于属于内核模块,直到v1.8.7.330。现在,如上所述,它已被移至BasicObject。

http://apidock.com/ruby/Kernel/method_missing