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

等号:

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

没有等号:

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

上述两个程序都以相同的方式执行。 在博客文章我不喜欢在斯卡拉的东西,我读到,当等号失踪,方法将返回Unit (与Java的void ),所以返回值的方法必须使用等号。 但是不返回值的方法可以用任何方式写。

在不返回值的Scala方法中使用等号的最佳做法是什么?

我实际上与丹尼尔很不一致。 我认为不应该使用不相等的语法。 如果您的方法作为API公开,并且担心意外返回错误的types,请添加显式的types注释:

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

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

尽pipe花费了我更多的工作,但我更喜欢显式types注释(即暴露的接口)。

更新:从斯卡拉2.10,使用等号是首选。 老答案:

返回Unit方法应该总是使用不等于的语法。 这样可以避免执行过程中潜在的错误进入API。 例如,你可能意外地做了这样的事情:

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

当然是一个微不足道的例子,但你可以看到这可能是一个问题。 由于最后一个expression式不返回Unit ,所以方法本身将具有除Unit之外的返回types。 这暴露在公共API中,并可能导致其他问题。 使用非等号语法,最后一个expression式无关紧要,Scala将返回types修复为Unit

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

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

 trait Foo { def bar(s: String) } 

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

除了返回单位的定义之外,您必须在呼叫声明中使用等号。

在后一种情况下,你可以放弃等号。 但是,这个语法可能会被废弃,所以最好避免这个语法。 使用等号并声明返回types将始终有效。

对于方法, Scala样式指南build议使用equals语法而不是过程语法

过程语法

避免使用过程语法,因为它在简洁的情况下很less有收获。

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

有一件事:想象一下应该返回的方法的最后一个声明单元不返回单元。 使用非等同的语法非常方便,我希望这不会被废弃,因为我看到它的几个用例

随着时间的推移,默认样式已经改变了,并且在许多回答的评论中已经提到了这一点,在官方的样式指南中推荐使用=语法来进行函数声明。

对于没有返回值的方法来说,expression这种方法的方法是将结果types和等号忽略,然后用花括号括起来的方法。 在这种forms下,该方法看起来像一个过程,一个只为其副作用执行的方法。