/ / Code source de la méthode uniq en Ruby - ruby

Code source de la méthode uniq en ruby ​​- ruby

Au levier, je tape

Array.instance_method(:uniq).source_location

Attendu: emplacement du code source pour uniq

Réel: nil

Qu'est-ce que je fais mal?

Réponses:

3 pour la réponse № 1

Vous voudrez peut-être relire le document sur Method#source_location:

Renvoie le nom de fichier source Ruby et le numéro de ligne contenant cette méthode ou nil si cette méthode n'a pas été définie dans Ruby (c'est-à-dire natif)

Le tableau comme vous pouvez le remarquer dans le coin supérieur gauche de cette page de document, est défini dans proc.c, cela dit que ce sont des méthodes sont natifs.


2 pour la réponse № 2

Method#source_location renvoie l'emplacement du Rubis code source. Selon l'implémentation Ruby que vous utilisez, il se peut qu'il n'y ait pas être Code source Ruby. En IRM, YARV, MRuby ou tinyrb, la méthode peut être implémentée en C, en XRuby ou JRuby, elle peut être implémentée en Java, en Ruby.NET ou IronRuby, elle peut être implémentée en C #, en MagLev, elle peut être implémenté dans Smalltalk, dans MacRuby ou RubyMotion, il peut être implémenté dans Objective-C, dans Topaz, il peut être implémenté dans RPython, dans Cardinal, il peut être implémenté dans Perl6 et dans Rubinius, il peut être implémenté dans C ++.

Cependant, dans Rubinius, beaucoup plus de méthodes sont implémentées dans Ruby que dans d'autres implémentations Ruby, donc la chance que vous obtiendrez réellement un source_location est beaucoup plus grande. Par exemple, voici ce que j'obtiens sur Rubinius:

Array.instance_method(:uniq).source_location
# => ["kernel/common/array.rb", 1640]

C'est quoi kernel/common/array.rb ressemble (le code a changé depuis que j'ai compilé ma version de Rubinius, c'est pourquoi les numéros de ligne ne correspondent pas):

def uniq(&block)
dup.uniq!(&block) or dup
end