2011-05-29 38 views
3

示例代碼:閉包在Ruby中

def func(a, &closure) 
    return a if a 
    closure ||= lambda{ |words| puts "!!! " + words } 
    closure.call("1") 
    closure.call("2") 
end 

func(false){ |words| puts "??? " + words } 

請解釋。如果刪除||將如下永久顯示

closure ||= lambda{ |words| puts "!!! " + words } 

"!!! 1", "!!! 2"我不明白這條線。爲什麼? 而且也解釋了這一點:

def func(a, &closure) 

放哪兒&closure

回答

4
def func(a, &closure) 
    return a if a 
    closure ||= lambda{ |words| puts "!!! " + words } 
    closure.call("1") 
    closure.call("2") 
end 

func(false){ |words| puts "??? " + words } 

在「&閉合」的符號(&)意味着該函數採用一個塊作爲一個參數。正在發生的事情是,你正在通過一個Proc(一個塊只是一個用不同語法定義的Proc)到func函數,然後用變量1和2調用該函數。

|| =表示「或等於」。 「如果當前值爲零,它用於爲變量賦值。這是簡寫​​:

closure = lamda{ |words| puts "!!! " + words } if closure.nil 

This blog post解釋塊,特效和lamdas好。

1

這裏的令牌closure根本沒有任何意義。它只是一個作爲參數給出的本地塊變量。當func與塊一起使用時,closure將引用該塊。如果不是,它最初將是nil||=是什麼,當變量是nil時,它分配什麼在右邊。因此,如果您在塊中使用func,則closure將爲該塊;如果你使用它沒有塊,closure將是lambda{...}。現在,如果您將||=替換爲=,那麼closure將始終爲lambda{...},無論您是否將它與塊一起使用。 closure.call(1)將代理1wordsclosure,您將得到輸出!!!1;與closure.call(2)類似,其輸出!!!2

1

這是無關的封閉

closure ||= lambda{ |words| puts "!!! " + words } 

||說,如果變量closure初始化只是使用它,否則初始化新的lambda ambda {| words |看跌期權 「!!!」 +詞}

因爲你逝去的已經

func(false){ |words| puts "??? " + words } 

默認拉姆達拉姆達(有!)未初始化

但是,如果你刪除||,它總是初始化新的lambda

您可以打印!!!無需刪除||,只需致電

func(false)