2016-06-09 69 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

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