Я изучаю Руби и недавно обнаружил то, что я не совсем понял. При смешивании модулей в классы класс Object не может обращаться к методам экземпляров модулей.Почему объекты класса имеют доступ к экземплярам модулей модуля Kernel?
module Swimmable
def swim
puts 'can swim'
end
end
class Fish
include Swimmable
end
Fish.swim
Результат undefined method 'swim' for Fish:Class (NoMethodError)
, который, как ожидается,
Однако, если метод экземпляра определен в модуле ядра, можно получить доступ к нему с помощью объекта класса и объект экземпляра.
module Kernel
def swim
puts 'can swim'
end
end
class Fish; end
Fish.swim # => can swim
Fish.new.swim # => can swim
Что делает объект класса Fish
возможность доступа к методам экземпляра в модуле ядра?
Если вы хотите, чтобы 'Swimmable' был доступен вашему классу, напишите' extend Swimmable' в 'Fish'. Таким образом, вам не нужно определять модуль в «Ядре». Дальнейшее чтение слова поиска: _singleton class_ –