我对为什么这段代码不起作用有点困惑:
def create(type)
Module.new do
def foo
type
end
end
end
在返回的模块上调用foo
时,未定义type
。 我应该使用 Proc 还是 lambda 来捕获创建方法中的范围?
(我最近可能做了太多的JavaScript)
tl;
dr 如何使用使用创建时可用变量的方法在运行时创建模块?
type
是一个局部变量。嗯,从技术上讲,它是一个参数,但参数的行为与局部变量相同。
局部变量是定义它们的范围的局部变量,这就是为什么它们被称为"局部"变量:type
是在create
方法内部定义的,但它不是在foo
方法中定义的。
Ruby 中有 4 个局部变量作用域:
- 脚本
- 模块/类定义
- 方法定义
- 块
在这四个中,只有块作用域嵌套,其他作用域创建新作用域。因此,如果要使用外部作用域中的变量,则必须使用块。
值得庆幸的是,有一个方法可以定义一个接受块的方法,它被恰当地命名为Module#define_method
:
def create(type)
Module.new do
define_method(:foo) do
type
end
end
end
顺便说一句:分配给m
是不必要的。