Ты не скажешь.
Единственный способ получить доступ к методу - это отправить сообщение #method
некоторому объекту, который затем вернет объект Method
. Но является ли Method
объект самим методом? Или это обертка вокруг метода? Или это конвертированная версия оригинального метода?
Вы не можете знать: если вы хотите посмотреть на метод, вы должны вызвать #method
, и в этот момент вы определенно получите объект. То, что было до того, как вы назвали #method
, вы не можете смотреть, поэтому вы не можете сказать.
Пара точек данных: в Ruby все возвращает значение. Что возвращает def
? Он всегда возвращает nil
, а не Method
объект. И define_method
? Возвращает Proc
, но не Method
(и не UnboundMethod
). [Примечание: в Rubinius def
возвращает скомпилированный байт-код метода, но все еще не объект Method
.]
Если вы посмотрите на 4-й и 5-й абзацы раздела 6.1 спецификации языка Ruby (строки 29-34 и 1-5 на страницах 5 и 6), вы можете ясно увидеть, что между методами и объектами проводится различие , И если вы посмотрите на спецификацию встроенных классов, то обнаружите, что там нет ни Method
, ни UnboundMethod
, ни Object#method
. IOW: вы можете создать полностью совместимый со стандартами интерпретатор Ruby, в котором методы не являются объектами.
Теперь блоки OTOH определенно не являются объектами. Есть много способов построить Proc
объектов из блоков, которые затем ведут себя так же, как и исходный блок (lambda
, proc
, Proc.new
, символ &
), но сами блоки не являются объектами.
Подумайте об этом так: вы можете передать строку в File.new
, чтобы создать объект файла, но это не делает строку файлом. Вы можете передать блок в Proc.new
для создания объекта proc, но это не делает блок процедурой.