Рубиновые модули и расширяем себя - PullRequest
15 голосов
/ 29 июля 2010

В какой ситуации код:

module M
   extend self
   def greet
    puts "hello"
   end

end

более выгоден для использования, скажем, что-то вроде:

module M
   def self.greet
    puts "hello"
   end
end

В самом верху один представляет собой расширяемый метод экземпляра, а последний - это просто метод класса, но при вызове любого из этих методов вы должны использовать M.greet, верно?Мне было просто любопытно, если бы кто-нибудь мог пролить свет на то, когда использовать один код поверх другого.Спасибо!

Ответы [ 3 ]

15 голосов
/ 29 июля 2010

Первый пример - это, как правило, люди достигают функциональности module_function (когда они не знают о существовании этого метода).

A module_function является одновременно методом экземпляра и методом класса. Во втором примере кода этот метод является просто методом класса.

10 голосов
/ 29 июля 2010

Было бы возможно сделать это с вашим первым примером, но не вашим вторым:

include M
greet
4 голосов
/ 14 февраля 2014

Модуль можно использовать как пространство имен путем написания методов модуля, а методы экземпляра модуля можно смешивать с другим объектом.

Концепция саморасширяющегося модуля позволяет использовать модуль обоими способами; или как отдельное пространство имен, или как миксин. Рассмотрим этот модуль:

module M
  def bar
    puts "bar"
  end
end
class C
  include M
end

Он имеет метод экземпляра и может быть смешан с другим объектом. У него нет метода модуля, и поэтому его нельзя использовать в качестве пространства имен:

puts M::bar # => undefined method `bar' for M:Module
puts C.bar  # => this is bar

Но модуль - это просто объект класса Module, как мы можем продемонстрировать

puts M.class   # => Module

Это значит, что мы можем сделать что-то сумасшедшее. Мы можем встроить модуль в себя, чтобы его методы стали методами экземпляра и модуля.

module M
  extend self
  def bar
    puts "bar"
  end
end
puts M::bar # => this is bar
puts C.bar  # => this is bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...