回答
隐Unit
返回类型:
def f() {println("ABC")}
明确Unit
返回类型:从最后的方法表达推断,仍然Unit
因为这是println
类型
def g(): Unit = {println("ABC")}
返回类型,但令人困惑:
def h() = println("ABC")
以上所有方法都是等效的。我更喜欢f()
,因为在方法签名之后缺少=
运算符就足够了。当您想额外记录该方法时,请使用明确的: Unit
。最后一种形式令人困惑,实际上在intellij-idea中被视为警告。
的=
运营商是至关重要的。如果存在,则意味着:“请返回方法正文中最后一条语句返回”的任何内容。很明显,你不能在abstract
方法中使用这个语法。如果不是,则假定Unit
。
的程序(方法返回单位)的特殊语法是一个错误。不要使用它。对于具有Java/C(++)背景的初学者来说,这是令人困惑和危险的。这是一种不必要的特殊待遇。始终使用等号,不管有没有类型推断(后者应仅用于私有成员):
def foo(): Unit = someCodeReturningUnit()
private def bar() = someCodeReturningUnit()
如果你是[风格指南部分](http://docs.scala-lang.org/style/types.html#void_methods)应该更新正确的“不必要的特殊待遇”。 – agilesteel 2012-02-27 09:19:56
@agilesteel关于该部分一直存在争议。 – 2012-02-27 13:24:22
风格指南[说](http://docs.scala-lang.org/style/declarations#procedure-syntax):“避免使用过程语法,因为它往往会让人感到困惑,因为在简洁中收获甚微。” – 2016-05-17 17:47:19
斯卡拉社区划分了。一方面,不使用明确的返回类型意味着您可以轻松地忘记标记,这会导致通常令人讨厌的错误跟踪。另一方面,Unit
- 具有不同语法的返回方法将它们放在一个单独的类别中,这让一些人感到高兴。
就个人而言,我宁愿这句法会消失 - 从失踪=
产生的误差恼人的跟踪。但它甚至没有被废弃,所以我宁愿利用它,而不仅仅是承受它存在的问题。
所以,使用任何你想。无论哪种方式都会有人批评你的选择,并且人们赞美它。
感谢Tomasz。你共享的代码引发了另一个问题:为什么你可以忽略'f'和'g'中的'='符号? – balteo 2012-02-27 08:26:34
如果你的函数返回'Unit',你可以省略'='符号。任何没有'='符号的函数都会返回'Unit' – Nicolas 2012-02-27 08:32:42
因为在'Unit'函数中'='是可选的。但是对于所有其他类型,这是强制性的,因为它们实际上返回了一些东西 – 2012-02-27 08:32:45