Как я могу вызвать статический метод в модуле Ruby из класса, который включает этот модуль? - PullRequest
22 голосов
/ 29 июля 2010

Возможно ли объявить статические методы в модуле в ruby?

module Software
  def self.exit
    puts "exited"
  end
end

class Windows
  include Software

  def self.start
    puts "started"
    self.exit
  end
end

Windows.start

В приведенном выше примере не будет распечатано "exited".в модуле?

Ответы [ 4 ]

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

Определите ваш модуль следующим образом (т.е. сделайте exit метод экземпляра в модуле):

module Software
  def exit
    puts "exited"
  end
end

, а затем используйте extend вместо include

class Windows
  extend Software
  # your self.start method as in the question
end

Используется:

irb(main):016:0> Windows.start
started
exited
=> nil

Объяснение

obj .extend (module, ...) добавляет к obj методы экземпляра из каждого модуля, заданные в качестве параметра

... поэтому при использовании в контексте определения класса (с самим классом в качестве получателя) методы становятся методами класса.

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

Поместите ваши методы класса во вложенный модуль, а затем переопределите «включенный» хук.Этот хук вызывается каждый раз, когда ваш модуль включен.Внутри хука добавьте методы класса тому, кто включил:

module Foo

  def self.included(o)
    o.extend(ClassMethods)
  end

  module ClassMethods

    def foo
      'foo'
    end

  end

end

Теперь любой класс, включая Foo, получает метод класса с именем foo:

class MyClass
  include Foo
end

p MyClass.foo    # "foo"

Любые не-классовые методы могутбыть определенным в Foo как обычно.

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

Необходимо изменить две вещи, чтобы можно было звонить Windows.exit:

  1. Software#exit должен быть методом экземпляра
  2. Windows нужно extend Software, а не include it.

Это связано с тем, что extend другой модуль помещает методы экземпляра этого модуля в качестве методов класса текущего модуля, тогда как include использование модуля ставит методы как новые методы экземпляра.

module Software
    def exit
        puts "exited"
    end
end

class Windows
    extend Software

    def self.start
        puts "started"
        self.exit
    end

end

Windows.start

Вывод:

started
exited
0 голосов
/ 29 июля 2010

В модуль можно включить статические методы:

module Software

  def self.exit
    puts "exited"

  end
end

Software.exit

Запуск этого отпечатка "завершен", как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...