【问题标题】:Is it possible to specify an anonymous function's return type, in Scala?是否可以在 Scala 中指定匿名函数的返回类型?
【发布时间】:2010-01-18 19:06:35
【问题描述】:

我知道你可以创建一个匿名函数,并让编译器推断它的返回类型:

val x = () => { System.currentTimeMillis }

仅仅为了静态类型,是否也可以指定它的返回类型?我认为这会让事情变得更清楚。

【问题讨论】:

    标签: scala anonymous-function static-typing


    【解决方案1】:
    val x = () => { System.currentTimeMillis } : Long
    

    【讨论】:

    • 这解决了我的问题。这比使用 Function# 方法更简洁。
    • 似乎val x = () => Long = {blah} 会是一种更直观的语法。感谢您的回答!
    【解决方案2】:

    Fabian 给出了直接的方法,但如果您喜欢对糖进行微观管理,其他方法包括:

    val x = new (() => Long) {
      def apply() = System.currentTimeMillis
    }
    

    val x = new Function0[Long] {
      def apply() = System.currentTimeMillis
    }
    

    甚至

    val x = new {
      def apply(): Long = System.currentTimeMillis
    }
    

    因为在大多数情况下,如果它来自 Function 没有区别,只是它是否有一个 apply。

    【讨论】:

      【解决方案3】:

      在我看来,如果您想让事情更清楚,最好通过在其中添加类型注释而不是函数的结果来记录对标识符 x 的期望。

      val x: () => Long = () => System.currentTimeMillis

      然后编译器将确保右侧的函数满足该期望。

      【讨论】:

      • 不确定你的意思是左边的函数满足那个期望,为结果块设置一个类型也可以确保类型是正确的,例如val x = () => { System.currentTimeMillis } : String 无法编译。还是你的意思是别的?
      • Geoff 的答案的优点是您可以预先获得完整的类型。如果您有一个长(多行)函数定义,那么如果类型位于开头,那么了解发生了什么是最快的。 Fabian 的答案的优点是重复性较低(尤其适用于简短的(单行)定义,并且如果您一眼就能理解整个事情,则可以更快地理解)。
      • 哦,现在我明白 Geoff 的意思了,他的类型定义包含输入类型,这里是 (),当函数 () => System.currentTimeMillis 分配给 x 时会检查它。跨度>
      • 是的,就是这样。我真的想说右手边不是左手边。
      • 相当于Function0[Long],虽然我通常更喜欢显示的符号。
      猜你喜欢
      • 2014-05-29
      • 2012-11-06
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      相关资源
      最近更新 更多