等号:
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方法中使用等号的最佳做法是什么?
答案 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)
对于没有返回值的方法,表达此类方法的方法是省略结果类型和 等号,使用括在花括号中的块的方法。在 在这种形式下,该方法看起来像一个过程,一个只执行的方法 因为它的副作用。