1

是否可以替代

@m1 = MyModule.method1
@m2 = MyModule.method2
@m3 = MyModule.method3
@m4 = MyModule.method4

像这样的东西

with MyModule do

  @m1 = method1
  @m2 = method2
  @m3 = method3
  @m4 = method4

end

在红宝石?

4

2 回答 2

2

你可以这样做:

def with(context, &block)
  yield context
end

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

我不完全确定这会给您带来什么好处-您能否更具体地说明您打算如何使用它?

于 2013-05-28T18:08:48.393 回答
1

不,这是不可能的。没有显式接收器的方法调用有一个隐式接收器self,因此为了method1调用MyModule.method1self需要更改为MyModule。这很容易,毕竟,这就是目的instance_evalinstance_exec目的。

但是,实例变量也属于,毕竟self这就是它们被称为实例变量的原因。因此,如果您更改selfMyModule, then@m1@m2也将属于MyModule并且不再属于它们在您的代码示例中属于的任何对象。

换句话说,你需要self改变,但你也不需要self改变。这是一个矛盾,因此,你想要的东西是不可能的。

于 2013-05-28T22:27:25.830 回答