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

我创建了一个函数

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

现在我收到警告:

a pure expression does nothing in statement position; you may be omitting necessary parentheses

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

Adaptation of argument list by inserting () has been deprecated: this is unlikely to be what you want. signature: Function1.apply(v1: T1): R given arguments: after adaptation: Function1((): Unit)

我究竟做错了什么?

解决方法

您可能想要将ignore声明为

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

带有返回Unit的0 arity函数

目前你有一个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
})

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...