在Ruby中调用没有模块名的模块类方法

时间:2013-05-28 17:43:45

标签: ruby-on-rails ruby

是否可以替换

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

有这样的东西

with MyModule do

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

end
在Ruby中

2 个答案:

答案 0 :(得分:2)

你可以这样做:

def with(context, &block)
  yield context
end

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

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

答案 1 :(得分:1)

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

但是,实例变量也属于self,这就是为什么它们被称为实例变量,毕竟。因此,如果您将self更改为MyModule,那么@m1@m2等也将属于MyModule,而不再属于他们所属的任何对象你的代码示例。

换句话说,您需要self进行更改,但您还需要self不要更改。这是一个矛盾,因此,你想要的是不可能的。