Задний план:
У меня есть модуль, который объявляет ряд методов экземпляра
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
И я хочу вызвать некоторые из этих методов из класса. Как вы обычно делаете это в ruby, так:
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
проблема
include UsefulThings
приносит все методы из UsefulThings
. В этом случае я только хочу format_text
и явно не хочу get_file
и delete_file
.
Я вижу несколько возможных решений этого:
- Каким-то образом вызвать метод непосредственно в модуле, не включая его в любом месте
- Я не знаю, как / если это можно сделать. (Отсюда и этот вопрос)
- Каким-то образом включить
Usefulthings
и только привнести некоторые из его методов- Я также не знаю, как / если это можно сделать
- Создайте прокси-класс, включите
UsefulThings
в него, затем делегируйтеformat_text
этому экземпляру прокси- Это бы сработало, но анонимные прокси-классы - это хак. Тьфу.
- Разделите модуль на 2 или более меньших модуля
- Это также сработало бы и, вероятно, является лучшим решением, которое я могу придумать, но я бы предпочел его избегать, так как в конечном итоге я получу распространение десятков и десятков модулей - управление этим будет обременительным.
Почему в одном модуле много несвязанных функций? Это ApplicationHelper
приложение из рельсов, которое наша команда де-факто определила как место для захоронения чего-либо, что недостаточно специфично, чтобы принадлежать где-либо еще. В основном автономные служебные методы, которые используются везде. Я мог бы разбить его на отдельных помощников, но их было бы 30, все с одним методом каждый ... это кажется непродуктивным
module UT; def add1; self+1; end; def add2; self+2; end; end
и вы хотите использовать, add1
но не add2
в классе Fixnum
. Как это поможет иметь функции модуля для этого? Я что-то упускаю?
Module#included
обратный вызов для запускаinclude
другого.format_text
Метод может быть перемещен в собственный модуль это, так как кажется , чтобы быть полезным на его собственный. Это сделало бы управление немного менее обременительным.