2016-09-27 3 views
3

Я изучаю Руби и недавно обнаружил то, что я не совсем понял. При смешивании модулей в классы класс 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 возможность доступа к методам экземпляра в модуле ядра?

+0

Если вы хотите, чтобы 'Swimmable' был доступен вашему классу, напишите' extend Swimmable' в 'Fish'. Таким образом, вам не нужно определять модуль в «Ядре». Дальнейшее чтение слова поиска: _singleton class_ –

ответ

1

От the documentation:

модуль Ядро включается классом Object, поэтому его методы доступны в каждом объекте Ruby.

Оба Fish экземпляров и сам Fish класса объекты, поэтому у них есть все методы, определенные в Kernel.

В первом случае вы получите сообщение об ошибке, поскольку Swimmable в Fish сделает Swimmable членами, доступными на экземплярах Fish, но не на самом классе.

+0

Спасибо за объяснение, это просто дало мне более глубокий уровень понимания 'Class' и' Object'. В принципе любой метод экземпляра объекта класса доступен для каждого объекта класса и объекта экземпляра. –

Смежные вопросы