代码之家  ›  专栏  ›  技术社区  ›  Esko Luontola

什么时候在scala方法声明中使用等号?

  •  80
  • Esko Luontola  · 技术社区  · 15 年前

    带等号:

    object HelloWorld {
      def main(args: Array[String]) = {
        println("Hello!")
      }
    }
    

    不带等号:

    object HelloWorld {
      def main(args: Array[String]) {
        println("Hello!")
      }
    }
    

    上述两个程序执行方式相同。在博客文章中 Things I do not like in Scala 我看到当等号丢失时,方法将返回 Unit (与Java一样) void ,因此返回值的方法必须使用等号。但是不返回值的方法可以用任何一种方式编写。

    在不返回值的scala方法中使用等号的最佳实践是什么?

    7 回复  |  直到 15 年前
        1
  •  104
  •   Jorge Ortiz    15 年前

    实际上我非常不同意丹尼尔的观点。我认为不相等的语法应该 从未 使用。如果您的方法被公开为API,并且您担心意外返回错误的类型,请添加显式类型注释:

    object HelloWorld {
      def main(args: Array[String]): Unit = {
        println("Hello!")
        123
      }
    }
    

    不相等语法较短,可能看起来“更干净”,但我认为它只是增加了混淆的可能性。有时我忘了添加一个等号,并且相信我的方法在返回单位时返回了一个值。由于与推断类型语法不相等和相等在视觉上非常相似,很容易忽略这个问题。

    尽管它花费了我更多的工作,但是我更喜欢显式的类型注释(即公开的接口)。

        2
  •  41
  •   VasiliNovikov    10 年前

    更新:从scala-2.10开始,最好使用等号。老回答:

    返回的方法 Unit 应该 总是 使用非等号语法。这样可以避免在实现过程中带入API的潜在错误。例如,您可能无意中做了这样的事情:

    object HelloWorld {
      def main(args: Array[String]) = {
        println("Hello!")
        123
      }
    }
    

    当然,这是一个微不足道的例子,但您可以看到这可能是一个问题。因为最后一个表达式 返回 单位 ,方法本身的返回类型不是 单位 . 这在公共API中是公开的,可能会导致其他问题。对于非等号语法,不管最后一个表达式是什么,scala都将返回类型固定为 单位 .

    它还有两个字符更清晰。:-)我也倾向于认为非等号语法使代码更容易阅读。更明显的是,问题中的方法返回 单位 而不是一些有用的价值。

    在相关的注释中,抽象方法有类似的语法:

    trait Foo {
      def bar(s: String)
    }
    

    方法 bar 有签名 String=>Unit . 当您省略抽象成员上的类型注释时,scala会这样做。再一次,它更干净,而且(我想)更容易阅读。

        3
  •  12
  •   Daniel C. Sobral    11 年前

    必须 使用除返回单位的定义之外的等号登录调用声明。

    在后一种情况下,您 可以 放弃等号。不过,这种语法可能会被弃用,因此最好避免使用。使用等号并声明返回类型将始终有效。

        4
  •  4
  •   cmd    10 年前

    对于方法, Scala Style Guide 建议使用等号语法,而不是过程语法

    过程语法

    避免使用过程语法,因为它往往容易混淆,而在简洁性方面获得的收益很少。

    // don't do this
    def printBar(bar: Baz) {
      println(bar)
    }
    // write this instead
    def printBar(bar: Bar): Unit = {
      println(bar)
    }
    
        5
  •  0
  •   jos    15 年前

    一件事:假设一个应该返回Unit的方法的最后一条语句不返回Unit。使用不相等的语法非常方便,我希望这不会被否决,因为我看到了它的几个用例。

        6
  •  0
  •   BeepDog    10 年前

    随着时间的推移,默认样式已经更改,并且在许多答案注释中都提到了这一点,建议在 official style guide 使用 = 函数声明的语法。

        7
  •  0
  •   sofiene zaghdoudi    8 年前

    对于没有返回值的方法,表示这种方法的方法是去掉结果类型和 等号,在方法后面是一个用大括号括起来的块。在 这种形式,方法看起来像一个过程,一个只执行的方法 因为它的副作用。