2016-06-09 81 views
4

執行功能我創建一個功能:警告而在功能

def ignore(f: Unit => Unit) = { 
    userDisabled = true 
    f 
    userDisabled = false 
} 

現在,我得到一個警告:

一個純粹的表達確實沒有在意見書;你可能會忽略必要的括號

當我添加了括號,寫f(),我得到:

通過插入()已棄用的參數列表的適應:這不太可能是你想。簽名:Function1.apply(v1:T1):R給定參數:函數1(():單元)

我在做什麼錯?

回答

11

你可能想申報ignore作爲

def ignore(f:() => Unit) = { 
    userDisabled = true 
    f() 
    userDisabled = false 
} 

隨着與0元數返回Unit

目前,你有希望Unit類型的參數1個ARG功能功能。這種類型只有一個值,它是()

當你只是說f,你什麼也不做,你不要調用函數,因此是第一個警告。這是因爲如果你只是把:

userEnabled = true 
42 
userEnabled = false 

當你說f()你不傳遞參數給需要一個功能。斯卡拉可以爲你放置Unit,但它已被棄用,因此第二個警告。你應該把它叫做f(())

的另一個選項是按名稱參數

def ignore(f: => Unit) = { 
    userDisabled = true 
    f 
    userDisabled = false 
} 

在這種情況下f被調用會引起副作用,每次使用它的方法體時有發生。這是在做這樣的事情,從來電者的角度最常見的方式,你就可以說

ignore { 
    //code 
} 

,而不是

ignore(() => { 
    //code 
}) 
+0

'f:=>單位'也可以工作... – Dima

+0

看來我已經提到它了:p –

0

寫作沒有括號,f一個功能,就是它有沒有副作用指示效果,該功能是「純」的。由於沒有parens的函數調用不是最後一條語句,因此它不會被返回,因此沒有整體效果。

當你正確的這f()你寫你的函數沒有參數。但它確實如此!它需要一些類型Unit。之前斯卡拉推斷爲您,但由於幾個問題,你現在必須,現在必須從2.11,手動提供它作爲f(())

+1

爲什麼downvote? –

+0

因爲沒有人想將單位傳遞給函數,所以它沒有任何用處。 顯然,ops問題在於函數聲明不正確,正如其他答案所解釋的那樣。 – Dima

+0

我明白了。是的,這是有道理的 –