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的问题在于,正如另一个答案所解释的,函数的声明不正确。我明白了。是的,这是有道理的