/ / Изходен код за метод uniq в Ruby - ruby

Изходен код за метода uniq в Ruby - ruby

Наистина пиша

Array.instance_method(:uniq).source_location

Очаква се: местоположение на изходния код за uniq

Актуално: nil

Какво правя грешно?

Отговори:

3 за отговор № 1

Може да искате да препрочетете документа на Method#source_location:

Връща името на файла и номера на реда на Ruby, съдържащ този метод, или нула, ако този метод не е дефиниран в Ruby (т.е. роден)

Масивът, както може да забележите в горния ляв ъгъл на тази страница на документа, е дефиниран в 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