我创建了一个函数:
def ignore(f: Unit => Unit) = {
userDisabled = true
f
userDisabled = false
}
现在我收到警告:
纯粹的表达在声明中没有任何作用;你可能会省略必要的括号
当我添加括号并写f()
时,我得到:
插入()的参数列表的改编已被弃用:这不太可能是你想要的。签名:Function1.apply(v1:T1):R给定参数:改编后:Function1(():Unit)
我做错了什么?
答案 0 :(得分:12)
您可能希望将ignore
声明为
def ignore(f: () => Unit) = {
userDisabled = true
f()
userDisabled = false
}
使用带有0 arity的函数返回Unit
目前,您有一个1个arg函数,需要Unit
类型的参数。这种类型只有一个值,它是()
。
当你简单地说f
时,你什么都不做,你就不要调用这个函数,因此是第一个警告。就好像你只是把:
userEnabled = true
42
userEnabled = false
当你说f()
时,你没有将参数传递给期望它的函数。 Scala可以为您提供Unit
,但它已被弃用,因此是第二次警告。您应将其称为f(())
。
另一个选项可以是通过名称参数调用
def ignore(f: => Unit) = {
userDisabled = true
f
userDisabled = false
}
在这种情况下f
会在每次在方法体中使用时发生副作用。这是执行此类操作的最常见方式,例如从调用方角度可以说
ignore {
//code
}
而不是
ignore(() => {
//code
})
答案 1 :(得分:0)
编写一个没有括号的函数f
表示它没有副作用,表明函数是“纯粹的”。由于没有parens的函数调用不是最后一个语句,因此不会返回,因此没有整体效果。
当你对这个f()
说你正在写你的函数没有参数时。但确实如此!它需要Unit
类型的东西。在Scala用来为你推断这个问题之前,由于你现在必须考虑几个问题,从2.11开始,手动提供f(())