Наистина пиша
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