Scala 在函数中执行函数时出现警告
我创建了一个函数:Scala 在函数中执行函数时出现警告,scala,Scala,我创建了一个函数: def ignore(f: Unit => Unit) = { userDisabled = true f userDisabled = false } 现在我得到一个警告: 纯表达式在语句位置上不起任何作用;您可能省略了必要的括号 当我添加括号并写入f()时,我得到: 通过插入()对参数列表进行自适应已被弃用:这不太可能是您想要的。签名:Function1.apply(v1:T1):R给定参数:自适应后:Function1(():Unit)
def ignore(f: Unit => Unit) = {
userDisabled = true
f
userDisabled = false
}
现在我得到一个警告:
纯表达式在语句位置上不起任何作用;您可能省略了必要的括号
当我添加括号并写入f()
时,我得到:
通过插入()对参数列表进行自适应已被弃用:这不太可能是您想要的。签名:Function1.apply(v1:T1):R给定参数:自适应后:Function1(():Unit)
我做错了什么?您可能想将
忽略声明为
def ignore(f: () => Unit) = {
userDisabled = true
f()
userDisabled = false
}
With是返回Unit
目前,您有一个1 arg函数,该函数需要类型为Unit
的参数。这种类型的值只有一个,它是()
当您简单地说f
时,您什么也不做,也不调用函数,因此出现了第一个警告。这就好像你刚刚把:
userEnabled = true
42
userEnabled = false
当您说f()
时,您并没有将参数传递给需要参数的函数。Scala可以为您放置单元
,但它已被弃用,因此出现了第二个警告。你应该把它叫做f(())
另一个选项可以是按名称参数调用
def ignore(f: => Unit) = {
userDisabled = true
f
userDisabled = false
}
在这种情况下,f
会导致每次在方法体中使用它时产生副作用。这是做这类事情最常见的方式,从呼叫方的角度来说,你可以这么说
ignore {
//code
}
而不是
ignore(() => {
//code
})
写一个没有括号的函数,f
,表示它没有副作用,表示函数是“纯的”。由于没有parens的函数调用不是最后一条语句,因此不会返回它,因此不会产生总体效果
当您将此f()
右转时,您编写的函数不带参数。但确实如此!它采用的是单元类型的东西。在Scala之前,它通常会为您推断出这一点,但由于一些问题,您现在必须从2.11开始,以f(())
的形式手动提供它,因为没有人希望将单元传递到函数中,所以它没有任何用途。显然,ops的问题在于,正如另一个答案所解释的,函数的声明不正确。我明白了。是的,这是有道理的