【问题标题】:Warnings while executing a function in a function在函数中执行函数时的警告
【发布时间】:2016-06-10 03:36:51
【问题描述】:

我创建了一个函数:

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

现在我收到警告:

纯表达式在语句位置不做任何事情;您可能会省略必要的括号

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

通过插入 () 来适应参数列表已被弃用:这不太可能是您想要的。签名:Function1.apply(v1: T1): R 给定参数:适配后:Function1((): Unit)

我做错了什么?

【问题讨论】:

    标签: scala


    【解决方案1】:

    您可能想将ignore 声明为

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

    With 是返回 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
    })
    

    【讨论】:

      【解决方案2】:

      编写一个没有括号的函数f,表明它没有副作用,该函数是“纯”的。由于没有括号的函数调用不是最后一条语句,因此不会返回,因此没有整体效果。

      当你纠正这个f() 时,你写的是你的函数没有参数。但它确实如此!它需要Unit 类型的东西。在 Scala 曾经为您推断这一点之前,但由于一些问题,您现在必须从 2.11 开始手动提供它为 f(())

      【讨论】:

      • 因为没有人愿意将一个单元传递给一个函数,所以它没有任何作用。显然,操作问题在于函数声明不正确,正如另一个答案所解释的那样。
      • 我明白了。是的,这是有道理的
      猜你喜欢
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 2013-12-11
      • 2022-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多