рубиновый модуль как набор методов

У меня есть приложение для направляющих, которое загружает много данных из некоторых сервисов 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

7
задан brad 18 January 2010 в 15:01
поделиться

2 ответа

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

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"
12
ответ дан 6 December 2019 в 07:26
поделиться

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
ответ дан 6 December 2019 в 07:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: