2013-03-16 23 views
0

我有以下代碼是工作和打印「的foreach執行」: 泛型與代碼塊返回單元

val buf = ArrayBuffer[() => Unit]() 
def add(o:() => Unit) = buf += o 
add(() => print("executed ")) 
print("foreach ") 
buf foreach (_()) 

我想簡化線路3,但它打破在第一行:

val buf = ArrayBuffer[=> Unit]() 
def add(o: => Unit) = buf += o 
add { print("executed ") } 
print("foreach ") 
buf foreach (_) 

有沒有辦法做到這一點?

回答

1

如果我理解你正確,你想存儲代碼段並在以後評估它們。 : => Type語法用於按名稱傳遞參數,這意味着每次參考時都會評估它(而不是在將它傳遞給函數之前)。據我所知,推遲評估的唯一方法是創建一些包裝,並通過方法調用使評估可用。在你的情況下,簡單的無參數的功能將是一個精細的包裝:

val buf = ArrayBuffer[() => Unit]() 
def add(o: => Unit) = buf += {() => o } 
add(() => print("executed ")) 
print("foreach ") 
buf foreach (_()) 
+1

*更正:*按名稱參數是_不_懶惰!它們不是在「首次需要時」評估的,它們會在被調用的方法中每次被引用_(動態,而不是靜態)評估。 – 2013-03-16 16:38:39

+0

謝謝,我編輯了我的答案 – EECOLOR 2013-03-16 18:14:48

2

您無法通過名稱值(=>T)作爲分配對象使用,只作爲方法的參數。 這意味着您無法通過=>Unit參數化您的ArrayBuffer。您的ArrayBuffer必須使用() => Unit進行參數化。

要將名稱值「提升」爲函數值,必須使用() => ...語法。 您可以執行以下操作:

val buf = ArrayBuffer[() => Unit]() 
def add(o: => Unit) = buf +=() => o 
add { print("executed ") } 
print("foreach ") 
buf foreach (_())