scala - 不带参数的函数,以单位作为 Scala 中的参数

标签 scala

def foo(x: Int, f: Unit => Int) = println(f())

foo(2, { Unit => 3 + 4 })

// case 1
def loop: Int = 7
foo(2, loop) // does not compile

changing loop to 
// case 2
def loop(): Int = 7
foo(2, loop) // does not compile

changing loop to
// case 3
def loop(x: Unit): Int = 7 // changing according to Don's Comments
foo(2, loop) // compiles and works fine

不应该case 1case 2也工作?为什么他们不工作?

将 foo 定义为
def foo(x: Int, y: () => Int)

然后 case 2有效但无效 case 1 .

他们不是都应该工作吗,以任何一种方式定义功能?

我也觉得 () => Int in foo 是一种糟糕的风格,y:=> Int不起作用。注释?

最佳答案

Scala 区分以下几点:

  • 没有参数列表的函数/方法(如果是函数,则为“按名称参数”)
  • 具有一个空参数列表的函数
  • 具有一个单位类型参数的函数

  • 这些都不是等价的,尽管为方便起见,Scala 允许您省略空参数列表。 (顺便说一下,两个空参数列表也不一样。)

    所以,即使 Unit写的是 () , 这与函数参数括号 () 不同用于函数或方法。相反,想想 ()作为 Tuple0 .

    所以,如果你说 f: Unit => Int ,你的意思是“f 采用一个参数,但它是一个非常无聊的参数,因为它是 Unit ,它必须始终是相同的无聊 Tuple0() ”。你写的东西真的很短f: (Unit) => Int .

    如果你说 f: () => Int ,那么您的意思是“f 不接受任何参数并产生 Int”。

    如果你说 f: => Int ,那么您的意思是“延迟执行任何语句会产生 Int 值,直到我们在此代码中使用它(并每次重新评估它)”。在功能上,这最终与 f: () => Int 基本相同(并且在内部转换为相同的 Function0 类),但它有不同的用法,大概是为了允许更紧凑的闭包形式(您总是在调用代码中省略 =>)。

    关于scala - 不带参数的函数,以单位作为 Scala 中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2774516/

    相关文章:

    scala - SLICK 3.0 - 多个查询相互依赖 - db.run(action)

    mysql - 如何使用 Slick 在 VARCHAR 列中使用 UUID?

    scala - 当 x.toString 失败时,ScalaRunTime.stringOf(x) 如何不失败?

    java - 在网络服务器上喷洒 akka 部署

    Scala 逆变困难

    scala - SBT 找不到另一个 sbt 文件中添加的解析器

    scala - 推断类型参数 [Boolean] 不符合方法过滤器的类型参数范围 [T < : slick. lifted.Rep[_]]

    scala - 在scala中执行Curl命令

    scala - 聚合scala函数说明

    Scala/Akka Future onComplete Success 编译器错误