【发布时间】:2012-03-16 17:46:36
【问题描述】:
我不确定将 Unit 指定为我的 scala 方法的返回类型或完全省略返回类型之间有什么区别。有什么区别?
谁能给点建议?
【问题讨论】:
标签: scala void return-type
我不确定将 Unit 指定为我的 scala 方法的返回类型或完全省略返回类型之间有什么区别。有什么区别?
谁能给点建议?
【问题讨论】:
标签: scala void return-type
Scala 社区对此存在分歧。一方面,不使用显式返回类型意味着您很容易忘记= 符号,这会导致经常令人讨厌的错误跟踪。另一方面,Unit-returning 具有不同语法的方法将它们放在一个单独的类别中,这让一些人感到高兴。
就个人而言,我宁愿这种语法消失——由于缺少= 而导致的错误 很烦人。但它甚至没有被弃用,所以我宁愿利用它,也不愿忍受它存在的问题。
所以,随心所欲地使用。无论哪种方式,都会有人批评您的选择,也有人会赞扬您的选择。
【讨论】:
隐式Unit返回类型:
def f() {println("ABC")}
显式Unit 返回类型:
def g(): Unit = {println("ABC")}
从最后一个方法表达式推断的返回类型,仍然是Unit,因为这是println的类型,但是令人困惑:
def h() = println("ABC")
以上所有方法都是等价的。我更喜欢f(),因为仅在方法签名之后缺少= 运算符对我来说就足够了。当您想要额外记录该方法时,请使用显式 : Unit。最后一种形式令人困惑,实际上在intellij-idea 中被视为警告。
= 运算符至关重要。如果存在,则表示:“请返回最后一条语句返回的任何内容”在方法主体中。显然,您不能将此语法用于abstract 方法。如果不是,则假定为Unit。
【讨论】:
f 和 g 中省略 = 登录?
Unit,你可以省略=符号。任何没有= 符号定义的函数都会返回Unit
Unit 函数中= 是可选的。但是,对于所有其他类型,这是强制性的,因为它们实际上会返回一些东西
= 符号。因此def g(): Unit {println("ABC")} 不能编译,但 def g(): Unit = {println("ABC")} 可以!仅供参考,这里是style guide 的链接。
过程的特殊语法(返回Unit的方法)是一个错误。不要使用它。对于具有 Java/C(++) 背景的初学者来说,这是令人困惑和危险的。而且是不必要的特殊处理。始终使用等号,有无类型推断(后者只应用于私有成员):
def foo(): Unit = someCodeReturningUnit()
private def bar() = someCodeReturningUnit()
【讨论】: