2012-09-02 33 views
3

例如,假設我有評估在一定範圍內的塊,並傳遞一個參數

block = proc { |n| "#{downcase} #{n}" } 

現在我要評估在String的範圍內,塊,但傳球被阻擋的變量。我知道如何做的第一部分:

"Foo".instance_eval(&block) 

但如何也傳遞一個變量到該塊?

我試圖

"Foo".instance_eval { block.call(3) } 

但它沒有工作,這是不是在String的範圍。

回答

5

使用instance_exec代替:

instance_exec(參數...){| VAR ... | block}→obj

在接收器的上下文中執行給定的塊(obj)。爲了設置上下文,當代碼正在執行時,變量self被設置爲obj,給出訪問obj的實例變量的代碼。參數作爲塊參數傳遞。

因此,這將使它進入:

"Foo".instance_exec(3, &block) 

,給你,你的願望'foo 3'

與此問題:

"Foo".instance_eval { block.call(3) } 

self"Foo"{ block.call(3) }但裏面blockblock將保留在block定義什麼self是; block.call(3)中沒有任何內容強制上下文,因此self不會更改。例如,給定這樣的:

class C 
    def m 
     proc { |n| "#{downcase} #{n}" } 
    end 
end 
c = C.new 
"Foo".instance_eval { c.m.call(3) } 

當PROC被調用時,selfc,因爲這是PROC定義什麼時候是self(即當m叫)。在instance_eval區塊內的self是什麼對於proc中的self沒有任何影響。

+0

非常感謝:) –

+0

@ janko-m:我剛剛添加了一些可能有趣的討論。 –

+0

我明白了。感謝您的解釋,我想我明白了。 –