Похоже, если вы хотите иметь возможность вызывать методы в модуле (/ Class), вы ищете одиночный код ... И если это так, вам лучше использовать методы класса или Singleton
mixin (не ищите ответов, какой из них "лучше").
Единственное преимущество (?), Которое я вижу при использовании #module_function
, - это гибкость, которую можно смешивать в модуле, а также вызывать методы модуля. Есть что-нибудь еще?
Я наткнулся на какой-то старый код, который раньше работал <1.9.3, но больше не работает, и я хочу исправить. Выглядело это примерно так: </p>
module MyThing
def self.do_something
...
end
end
... и допускается для:
MyThing.do_something
Я не пытаюсь утверждать, что этот дизайн был хорошим - просто пытаюсь выяснить, как лучше всего это исправить. Склоняясь к стандартному модулю ...
Обновление ...
Я неправильно упростил мою проблему и пример. Различное поведение, которое я испытываю, проявляется во время моих тестов RSpec - они проходят с использованием RSpec 2.8.0 с MRI 1.9.2, но терпят неудачу с MRI 1.9.3. Модуль выглядит так:
module MyThing
module SubThing
module SubSubThing
def self.do_something
...
end
end
end
end
... и тесты:
describe MyThing::SubThing::SubSubThing do
include MyThing::SubThing
describe "#do_something" do
it "does something" do
SubSubThing.do_something
end
end
end
При запуске спецификации под 1.9.3 я получаю NameError: uninitialized constant DataGathering
; под 1.9.2 они проходят. Это привело меня к неправильной диагностике проблемы и представлению того, что я сделал выше. Кажется, что include
поведение отличается в 1.9.3. Все в порядке; мой вопрос все еще стоит: #module_function
предоставляет что-то особенное?