Ruby 中的闭包和模块

Bal*_*ard 2 ruby

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

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
如何使用使用创建时可用变量的方法在运行时创建模块?

Jör*_*tag 6

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