Ruby with Module 中的闭包



我对为什么这段代码不起作用有点困惑:

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是不必要的。

最新更新