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

何时在Scala方法声明中使用等号?,scala,Scala,等号: object HelloWorld { def main(args: Array[String]) = { println("Hello!") } } object HelloWorld { def main(args: Array[String]) { println("Hello!") } } 没有等号: object HelloWorld { def main(args: Array[String]) = { println("Hel

等号:

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

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
  }
}
object HelloWorld {
  def main(args: Array[String]) {
    println("Hello!")
  }
}
上述两个程序的执行方式相同。在博客文章中,我读到当缺少等号时,该方法将返回
Unit
(与Java的
void
)相同),因此返回值的方法必须使用等号。但是,不返回值的方法可以用任何一种方式编写


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

更新:从Scala-2.10开始,最好使用等号。旧答案:

返回
Unit
的方法应始终使用非等于语法。这避免了在实现过程中遗留到API中的潜在错误。例如,您可能意外地做了如下操作:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
    123
  }
}
当然,这是一个微不足道的例子,但您可以看到这可能是一个问题。由于最后一个表达式不返回
Unit
,因此方法本身的返回类型不是
Unit
。这在公共API中公开,可能会导致其他问题。使用non-equals语法,不管最后一个表达式是什么,Scala将返回类型固定为
Unit

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

另一方面,抽象方法也有类似的语法:

trait Foo {
  def bar(s: String)
}

方法
bar
具有签名
String=>Unit
。当您忽略抽象成员上的类型注释时,Scala就会这样做。再一次,这本书更清晰,而且(我认为)更容易阅读。

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

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello!")
    123
  }
}
非相等语法较短,可能看起来“更干净”,但我认为它只是增加了混淆的可能性。我有时会忘记加一个等号,并且认为我的方法返回的是一个值,而实际上它返回的是单位。因为non-equal和equal with推断类型语法在视觉上非常相似,所以很容易忽略这个问题

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

除了返回单元的定义之外,您必须在调用声明中使用等号


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

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

随着时间的推移,默认样式已经发生了变化,这已经在许多答案的注释中提到,建议在函数声明中使用
=
语法。

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

过程语法

避免使用过程语法,因为它容易混淆,在简洁性方面几乎没有什么好处


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

不使用等号也是Scala风格指南中的建议:我写了这一点,所以在权衡引用时,您可能应该记住这一点。:-)哈哈,所以我向我的女朋友描述了这个小小的交流,只是因为我发音不好,所以“比特”变成了“婊子”。不用说,喜剧接踵而至。ScalaDays 2013,Martin Odersky,:应该避免程序声明(非相等语法)。官方风格指南不再推荐这种方法:我喜欢这种方法,它更明确,因此对读者来说更清晰。显然,这是现在推荐的风格()我也同意,我认为不带=的语法应该从语言中完全删除。奥德斯基在他的主题演讲“Scala with Style”中说,这是一个历史性的错误。他不得不添加这个语法(不带=),这样他就可以对Java开发人员隐藏“Unit”,以免他们感到困惑。他还提到,它将在将来被删除。如果方法定义中忘记了等号,有没有办法发出警告?例如,作为编译器选项,或在任何源代码分析工具中?书籍、邮件列表、源代码。顺便说一句,从那时起,很明显后一种语法不太可能被弃用,并且受到了许多人的青睐。看起来types style guide(类型样式指南)始终显示using=。您提供的链接只讨论函数,而不是过程(即返回单元的函数)。您是对的,@EskoLuontola,很抱歉,我可能从打开的许多选项卡中的一个复制了错误的链接,它已被更新。