Ruby on Rails: модули против классов
Я пытаюсь добавить функцию, которая будет доступна во всех частях моей программы. Мне нужно что-то вроде:
def GlobalFunctions.my_function(x,y)
puts x + y
end
для всех моделей. В частности, я пытаюсь использовать такую функцию в моем файле seeds.rb, но я, скорее всего, буду повторно использовать код и не хочу никакой избыточности. Теперь я знаю, что могу сделать простой класс, но я мог бы также создать модуль. Каковы некоторые причины идти в любом направлении? И как только я решил, какой тип использовать, как сделать его доступным во всей программе?
Я пробовал модуль, но я продолжаю получать "Ожидаемое приложение/[файл модуля] для определения [ModuleName]"
Ответы
Ответ 1
Вы должны определить класс для чего-то, что вы захотите сделать экземплярами. В этом случае модуль, вероятно, будет лучше, поскольку модули в основном просто группируют код вместе:
module GlobalFunctions
def self.my_function(x,y)
puts x+y
end
end
GlobalFunctions.my_function(4,5) # => 9
В качестве альтернативы вы можете определить его на Kernel, а затем просто назовите его в любом месте. В ядре определены методы, такие как puts.
def Kernel.my_function(x,y)
puts x + y
end
my_function(4,5) # => 9
Ответ 2
Добавление методов в ядро (ответ от PreciousBodilyFluids) обычно считается неприятным запахом и может привести к тому, что действительно трудно найти ошибки в крупных проектах.
Это гораздо более приемлемо для соответствующего пространства имен кода и помещается в /lib/.
class Formatting
def self.bold(str)
return "<strong>#{str}</strong>"
end
end
Вы можете:
require 'formatting'
puts Formatting.bold("text")
или
require 'formatting'
include Formatting
puts bold("text")
Каждому, кто приходит к коду позже, будет понятно, что вы используете. Если вы используете Rails, вам не понадобится.
Ответ 3
PreciousBodilyFluids верен, и если этот GlobalFunctions
является частью проекта RoR, вы можете указать файл global_functions.rb
и поместить его в каталог lib/
, чтобы избежать сообщения об ошибке, которое вы отправили на конец вашего вопроса.