2014-09-09 4 views
3

Есть ли разница между двумя приведенными ниже примерами? Возможно ли получить конфликты методов во втором примере из-за имен методов? Не являются ли методы внутри модуля автоматически «инкапсулированы» внутри этого модуля?Использование self в модулях

Пример 1

module ImageUtils 
    def self.preview(image) 
    #do something 
    end 
end 

Пример 2

module ImageUtils 
    def preview(image) 
    #do something 
    end 
end 

Если бы я положил все в класс Foo в модуле ImageUtils, как бы это отличается?

ответ

8

Разница заключается в том, что первый пример определяет модуль метод называется preview, а второй пример определяет метод Mixinpreview.

Чтобы включить первый класс в класс, вы сможете вызвать этот метод в классе (тогда как вызов метода в экземпляре класса приведет к ошибке), включая включение второго модуля в класс позволит вызвать метод для экземпляров класса, но вызов метода на классе сам вызовет

NoMethodError: undefined method preview for Foo:Class 

Что касается конфликтов основываясь на том же имени метода в классе и модуль включен в него. Ответ на этот вопрос лежит в методе Ruby, поиске, который является следующим:

  1. Метода из одноплодных/меты/собственного класса объекта
  2. Метода из предваряются модулей (Ruby 2.0+ функция)
  3. методы из объекта, класс
  4. Методы из включенных модулей
  5. методы из иерархии классов (суперкласса и его предков)

Me при поиске метода останавливается поиск.

С prepend метод mixin будет иметь приоритет в поиске метода;

Метод include, определенный в классе, имеет приоритет в поиске методов.

Таким образом, никаких конфликтов не существует.

+0

Я знаю метод класса и экземпляра, просто хотел убедиться, что он ничего не меняет в том, как работает пространство имен. – xotix

+0

это только вопрос вашего намерения относительно использования метода - будет ли он использоваться в классе или на его экземплярах. –

+0

технически это не метод класса, а метод экземпляра одноэлементного класса. –

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