Скажем, я хочу пропатчить модуль Kernel
одним методом, который только что придумал:
module Kernel
def say_hello
puts "hello world"
end
end
Теперь я точно могу это сделать:
Object.new.say_hello # => hello world
но я также могу сделать следующее, что я обычно не могу сделать:
Object.say_hello # => hello world
Поскольку Object
включает в себя Kernel
, он принимает методы своего экземпляра, и поэтому все экземпляры Object
должны реагировать на say_hello
. Все идет нормально.
Однако Object.say_hello
кажется методом класса, который можно было бы оправдать, только если бы мы сделали что-то похожее на это:
class << Object
def say_hello
puts "hello world"
end
end
Хранение say_hello
в одноэлементном классе Object
позволит нам использовать его как метод класса, но вместо этого Kernel
будет просто включено в Object
, что не должно допускать такого поведения. Но это так. Кто-нибудь знает, почему?
Спасибо
Object
— этоClass
, которое являетсяObject
. Вот почему он отвечает наsay_hello
:) - person Sergio Tulentsev   schedule 18.10.2017