2013-05-12 74 views
0

在下面的代碼中,我正在閱讀閉包,但是想知道如果函數中有多個proc對象會發生什麼。所以當函數被調用時,只有最後一個lambda被調用了。我在下面測試了這個。 (interactive:http://labs.codecademy.com/BAZX#:workspace在帶有兩個lambda的函數中,與.call一起使用時,如何評估最後一個lambda? (ruby clojures)

def n_times(thing) 
    lambda {|n| puts "first called"; thing * n} 
    lambda {|n| puts "second called"; thing - n} 
end 

test = n_times(2) 
puts test.call(3) 

第一個lambda是怎麼跳過的?

puts n_times(3).call(2) => second called 1 

此外,爲什麼下列無效?編輯:刪除,愚蠢的錯誤。謝謝:)

+0

這是很難回答這樣的問題不理解你爲什麼認爲應該調用第一個lambda表達式,或者爲什麼認爲第二個示例應該是有效的。就像你期望第二個例子所做的一樣?當你將管道放在它周圍時,你認爲這意味着什麼? – 2013-05-12 03:21:35

+0

我測試這個的原因是因爲.call除了將參數傳遞給塊之外,並不真正帶參數。但我不知道lambda .call選擇執行什麼。我想測試它是否執行了兩個塊,所以我使用了put語句來查看第一個代碼是否至少已被執行,但事實並非如此。我不明白爲什麼。 – Senjai 2013-05-12 03:27:06

回答

1

lambda是一個閉包,意味着它裏面的代碼不會運行,直到lambda被調用。您創建第一個lambda,但是在執行lambda.call之前,塊中的所有代碼都不會執行。

最後一個lambda被返回,所以它被稱爲。這裏是執行的一點點時間線:

test = n_times(2) 
puts test.call(3) 
  1. n_times稱爲(2傳入)在n_times
  2. 拉姆達2中創建「
  3. 拉姆達2是隱式返回的範圍內創建
  4. 拉姆達1(最後一個值),存儲在test
  5. test.call(5) - 所述第二拉姆達調用與5
  6. 通過「第二稱爲「被打印出來,並返回-1

不再相關:

lambda {|t| puts |t|} 

應該

lambda {|t| puts t} 
+0

我以爲這就是爲什麼我在第一個lambda中放入一個puts語句,即使它不是被返回的那個,它應該仍然打印到控制檯上嗎? – Senjai 2013-05-12 03:19:19

相關問題