2017-03-05 53 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