詮索好きで私はタイプしている
Array.instance_method(:uniq).source_location
予想:uniqのソースコードの場所
実際: nil
私は間違って何をしていますか?
回答:
回答№1の場合は3あなたは上のドキュメントを読み直したいかもしれません Method#source_location
:
このメソッドを含むRubyソースファイル名と行番号を返します。このメソッドがRubyで定義されていない場合はnilを返します(つまり、ネイティブ)
このドキュメントページの左上隅にある配列は、次のように定義されています。 proc.c
、それはそれが方法だと言った ネイティブです.
回答№2については2
Method#source_location
の場所を返します ルビー ソースコード。使用している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