我不确定将Unit指定为我的scala方法的返回类型或完全省略返回类型之间的区别。有什么区别?
有人可以提供建议吗?
答案 0 :(得分:53)
隐式Unit
返回类型:
def f() {println("ABC")}
显式Unit
返回类型:
def g(): Unit = {println("ABC")}
从上一个方法表达式推断的返回类型仍为Unit
,因为这是println
的类型,但令人困惑:
def h() = println("ABC")
上述所有方法都是等效的。我更喜欢f()
,因为仅在方法签名后缺少=
运算符对我来说已经足够了。如果要额外记录方法,请使用显式: Unit
。最后一种形式令人困惑,实际上被视为intellij-idea中的警告。
=
运营商至关重要。如果它存在,则表示:“请返回方法体中最后一个语句返回的”。显然,您不能将此语法用于abstract
方法。如果不是,则假设为Unit
。
答案 1 :(得分:14)
过程的特殊语法(返回 Unit 的方法)是一个错误。不要使用它。对于具有Java / C(++)背景的初学者来说,这是令人困惑和危险的。这是一种不必要的特殊待遇。始终使用等号,有和没有类型推断(后者只应用于私人成员):
def foo(): Unit = someCodeReturningUnit()
private def bar() = someCodeReturningUnit()
答案 2 :(得分:6)
Scala社区对此有所分歧。一方面,不使用显式返回类型意味着您可以轻松忘记=
符号,这会导致通常很难跟踪的错误。另一方面,Unit
- 返回具有不同语法的方法将它们放在一个单独的类别中,这让一些人高兴。
就个人而言,我宁愿这种语法会消失 - 由于缺少=
而导致的错误令人讨厌。但它甚至都没有被弃用,所以我宁愿利用它而不仅仅是遇到它存在的问题。
所以,使用你想要的任何东西。无论是哪种方式,都会有人批评你的选择,而且人们都会赞美它。