модуль ruby ​​как набор методов - PullRequest
7 голосов
/ 18 января 2010

У меня есть приложение rails, которое загружает много данных из некоторых Java-сервисов. Я пишу модуль, который позволит мне заполнить некоторые поля выбора этими данными, и я пытаюсь включить их правильно, чтобы я мог ссылаться на них в своих представлениях. Вот мой модуль

module FilterOptions
  module Select

    def some_select
     return "some information"
    end
  end
end

Моя идея состояла в том, чтобы включить FilterOptions в мой application_helper, и я подумал, что смогу ссылаться на свои методы, используя Select::some_select Это не так. Я должен include FilterOptions::Select, тогда я могу ссылаться на метод some_select самостоятельно. Я не хочу этого, хотя, как мне кажется, это немного сбивает с толку кого-то, кто может не знать, что some_select исходит из моего собственного модуля.

Итак, как мне написать методы модуля, которые похожи на публичные статические методы, чтобы я мог включить свой основной модуль и ссылаться на свои методы, используя пространство имен подмодуля, например Select::some_select

Ответы [ 2 ]

12 голосов
/ 18 января 2010

module_function заставляет функцию модуля вызываться как метод экземпляра или как функцию модуля:

#!/usr/bin/ruby1.8

module Foo

  def foo
    puts "foo"
  end
  module_function :foo

end

Foo.foo        # => foo
Foo::foo       # => foo

include Foo
foo            # => foo

Иногда вы хотите, чтобы каждый метод в модуле был «функцией модуля», но он может быть утомительным и повторным, чтобы повторять «module_function» снова и снова. В этом случае просто сделайте так, чтобы ваш модуль сам расширялся:

!/usr/bin/ruby1.8

module Foo

  extend self

  def foo
    puts "foo"
  end

end

Foo.foo        # => foo
Foo::foo       # => foo

include Foo
foo            # => foo
12 голосов
/ 18 января 2010

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

module FilterOptions
  module Select
    def self.some_select
     return "some information"
    end
  end
end

puts FilterOptions::Select.some_select
# => "some information"

Также возможно импортировать один модуль, а не импортировать следующий, вместо этого обратитесь к нему по имени:

include FilterOptions
puts Select.some_select
# => "some information"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...