Ruby中uniq方法的源代码



在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

最新更新