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