Какой monkeypatch создает разделение частного метода?

Вопросы Ruby: вызов частного метода для 3:Fixnum и частный метод «split», вызванный для nil: NilClass (NoMethodError), упомяните частные методы split для Fixnum и NilClass объектов соответственно.

Является ли этот закрытый метод split псевдоключевым словом с исправлением обезьяны (например, print и puts)? Если да, то что добавило его, и почему они использовали имя метода, которое уже существует для String?


person Andrew Grimm    schedule 18.04.2011    source источник
comment
print и puts не являются псевдоключевыми словами. Это всего лишь методы. Я не знаком с каким-либо гемом или библиотекой, которые добавляют #split к NilClass, поэтому я не могу комментировать это напрямую. Возможно, вы можете провести некоторую экспертизу, чтобы выяснить, какая библиотека исправляет NilClass, чтобы добавить закрытый метод #split (что довольно странно).   -  person Rein Henrichs    schedule 18.04.2011
comment
split поступает из ядра, как отмечает DigitalRoss. Затем, предположительно, Fixnum и NilClass предоставляют свои собственные частные переопределения, чтобы, по сути, удалить split из своего интерфейса.   -  person mu is too short    schedule 18.04.2011
comment
@mu слишком короткий: D'Oh! Не знаю, почему я этого не заметил - может быть, это было опубликовано/добавлено после того, как я уже прочитал этот вопрос. Должен ли я просто закрыть вопрос или удалить его?   -  person Andrew Grimm    schedule 18.04.2011
comment
Просто закройте или удалите его и обвините в этом воскресное похмелье :) Или я мог бы опубликовать ответ с некоторым кодом, чтобы мы могли бороться за отступ.   -  person mu is too short    schedule 18.04.2011
comment
@mu слишком короток: нет необходимости - я только что получил значок редактора копий!   -  person Andrew Grimm    schedule 18.04.2011


Ответы (1)


Вы можете решить это самостоятельно (даже не читая другой ответ):

ruby-1.8.7-p330 :001> 3.method(:split)
#=> #<Method: Fixnum(Kernel)#split> 

Вы можете увидеть мой Поток поиска методов Ruby (PDF-версия), что методы для всех объектов заканчиваются методами экземпляра Object…который сам включает Kernel. Таким образом, все методы экземпляра Kernel (добавлено много случаев, доступных в качестве удобных методов верхнего уровня) также становятся методами для каждого объекта.

Обратите внимание, что это неверно в версии 1.9+, поскольку Kernel#split было удалено:

ruby-1.9.1-p378 :001> 3.method(:split)
#=> NameError: undefined method `split' for class `Fixnum'
#=>     from (irb):1:in `method'
#=>     from (irb):1
#=>     from /Users/phrogz/.rvm/rubies/ruby-1.9.1-p378/bin/irb:16:in `<main>'
person Phrogz    schedule 18.04.2011