在pry中,我正在键入
Array.instance_method(:uniq).source_location
预期:uniq 的源代码位置
实际:nil
我做错了什么?
您可能需要重新阅读Method#source_location
:上的文档
返回包含此方法的Ruby源文件名和行号,如果此方法未在Ruby中定义,则返回nil(即原生)
在这个文档页面的左上角,您可能会注意到数组是在proc.c
中定义的,也就是说它的方法是原生的。
Method#source_location
返回Ruby源代码的位置。根据您使用的Ruby实现,可能没有的Ruby源代码。在MRI、YARV、MRuby或tinyrb中,该方法可以用C、XRuby或JRuby实现,可以用Java、Ruby.NET或IronRuby实现,可以在C#、MagLev、Smalltalk、MacRuby或RubyMotion中实现,也可以在Objective-C、Topaz、RPython、Cardinal、Perl6和Rubinius中实现,它可以用C++来实现。
然而,在Rubinius中,Ruby中实现的方法比其他Ruby实现中实现的要多得多,因此实际获得source_location
的机会要大得多。例如,这就是我在Rubinius上得到的:
Array.instance_method(:uniq).source_location
# => ['kernel/common/array.rb', 1640]
这就是kernel/common/array.rb
的样子(自从我编译了Rubinius版本以来,代码发生了变化,这就是行号不匹配的原因):
def uniq(&block)
dup.uniq!(&block) or dup
end