何时在Scala方法声明中使用等号?

时间:2009-06-03 10:47:41

标签: scala

等号:

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 个答案:

答案 0 :(得分:105)

我实际上与丹尼尔强烈反对。我认为永远不会使用不相等的语法。如果您的方法作为API公开,并且您担心意外返回错误的类型,请添加显式类型注释:

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

不相等的语法更短,可能看起来“更干净”,但我认为这只会增加混淆的可能性。我有时忘记添加一个等号,并且相信我的方法在返回Unit时返回了一个值。因为非等同和相等推断类型的语法在视觉上是相似的,所以很容易错过这个问题。

即使它花费了我更多的工作,但我更喜欢显式类型注释(即暴露的接口)。

答案 1 :(得分:41)

更新:从Scala-2.10开始,首选使用等号。老答案:

返回Unit的方法应该总是使用非等于语法。这避免了实施中携带到API的潜在错误。例如,你可能不小心做了这样的事情:

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

当然是一个简单的例子,但你可以看到这可能是一个问题。因为最后一个表达式返回Unit,所以方法本身将具有除Unit之外的返回类型。这在公共API中公开,并可能导致其他问题。使用非等于语法,最后一个表达式是什么并不重要,Scala将返回类型修复为Unit

这也是两个字符更清洁。 :-)我也倾向于认为非等式语法使代码更容易阅读。更明显的是,有问题的方法返回Unit而不是一些有用的值。

在相关的说明中,抽象方法有类似的语法:

trait Foo {
  def bar(s: String)
}

方法bar具有签名String=>Unit。当您在抽象成员上省略类型注释时,Scala会执行此操作。再次,这是更清洁,(我认为)更容易阅读。

答案 2 :(得分:12)

必须使用等于登录的声明声明,但返回单位的定义除外。

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

答案 3 :(得分:4)

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

  
    

过程语法

         

避免使用过程语法,因为在简洁方面获得的收益往往令人困惑。

  
// don't do this
def printBar(bar: Baz) {
  println(bar)
}
// write this instead
def printBar(bar: Bar): Unit = {
  println(bar)
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

随着时间的推移,默认样式已经改变,并且在许多评论的答案中都提到了这一点,建议在official style guide中使用=语法进行函数声明。< / p>

答案 6 :(得分:0)

对于没有返回值的方法,表达此类方法的方法是省略结果类型和 等号,使用括在花括号中的块的方法。在 在这种形式下,该方法看起来像一个过程,一个只执行的方法 因为它的副作用。