2017-03-05 54 views
1

我为什么这段代码不工作有点纳闷:闭包在Ruby中与模块

def create(type) 
    Module.new do 
    def foo 
     type 
    end 
    end 
end 

当调用返回的模块footype没有定义。 我是否应该使用Proc或者lambda来捕获create方法中的作用域?

(我大概做了太多的JavaScript最近)

TL;博士
我怎么能在运行时创建与使用可用的变量在创建时间的方法模块?

回答

4

type是一个局部变量。从技术上讲,它是一个参数,但参数的行为与局部变量相同。

局部变量是局部的,只在定义的范围,这就是为什么他们被称为“局部”变量:typecreate方法中定义的,它不是foo方法中定义。

有4个局部变量作用域在红宝石:

  • 脚本
  • 模块/类定义
  • 方法定义

这四个中,只有块范围巢其他人创造新的范围。所以,如果你想使用外部变量的变量,你必须使用块。

幸运的是,有定义需要一个块的方法的方法,并且它被恰当地命名为Module#define_method

def create(type) 
    Module.new do 
    define_method(:foo) do 
     type 
    end 
    end 
end 

顺便说一句:分配给m是不必要的。

+0

非常感谢解决方案,但主要是为了解释!我会记住只有块捕获它们的外部范围;) – Balzard