在Ruby中,method_missing方法定义在哪里?

3

我使用的是ruby-1.9.3版本。

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

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

4个回答

8
使用Method#owner可以知道哪个类定义了该方法。
method(:method_missing).owner # => BasicObject

7

这是一个私有方法: 尝试:

BasicObject.private_methods.grep /missing/

@stevenGe 在这种情况下,您需要接受答案为正确。这是SOW的正确政策。 - p.matsinopoulos

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

1

如果有其他人在阅读旧材料时感到困惑,那么这种方法显然曾经属于Kernel模块,直到版本1.8.7.330。现在,正如所提到的,它已经被移动到BasicObject中。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接