2013-05-28 2 views

ответ

1

Нет, это невозможно. Вызов метода без явного приемника имеет неявный приемник self, поэтому для того, чтобы сделать method1, необходимо позвонить по номеру MyModule.method1, self необходимо изменить на MyModule. Это довольно легко, в конце концов, вот что такое instance_eval и instance_exec.

Однако переменные экземпляра также относятся к self, поэтому в конце концов они называются экземплярами. Итак, если вы измените self на MyModule, то @m1, @m2 и т. Д. Также будут принадлежать MyModule и больше не принадлежат тому объекту, к которому они принадлежат в вашем примере кода.

Другими словами, вам нужно self изменить, но вам также необходимо self не менять. Это противоречие, эрго, то, что вы хотите, невозможно.

2

Вы могли бы сделать что-то вроде этого:

def with(context, &block) 
    yield context 
end 

with MyModule do |m| 
    @m1 = m.method1 
    @m2 = m.method2 
    ... 
end 

Я не совсем уверен, что выгоды это дает вам - вы могли бы быть более конкретной информацией о том, как вы планируете использовать?

Смежные вопросы