在函数中执行函数时发出警告

时间:2016-06-09 18:28:12

标签: scala

我创建了一个函数:

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

现在我收到警告:

  

纯粹的表达在声明中没有任何作用;你可能会省略必要的括号

当我添加括号并写f()时,我得到:

  

插入()的参数列表的改编已被弃用:这不太可能是你想要的。签名:Function1.apply(v1:T1):R给定参数:改编后:Function1(():Unit)

我做错了什么?

2 个答案:

答案 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(())