我有点困惑为什么这段代码不起作用:
def create(type)
Module.new do
def foo
type
end
end
end
Run Code Online (Sandbox Code Playgroud)
当调用foo返回的模块时,type未定义。我应该使用 Proc 或 lambda 来捕获 create 方法中的范围吗?
(我可能最近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
Run Code Online (Sandbox Code Playgroud)
顺便说一句:分配给m是不必要的。