我应该使用Unit还是省略scala方法的返回类型?

bal*_*teo 50 scala return-type void

我不确定将Unit指定为我的scala方法的返回类型或完全省略返回类型之间的区别.有什么不同?

任何人都可以建议吗?

Tom*_*icz 53

隐式Unit返回类型:

def f() {println("ABC")}
Run Code Online (Sandbox Code Playgroud)

显式Unit返回类型:

def g(): Unit = {println("ABC")}
Run Code Online (Sandbox Code Playgroud)

从最后一个方法表达式推断的返回类型,仍然Unit因为这是类型println,但令人困惑:

def h() = println("ABC")
Run Code Online (Sandbox Code Playgroud)

上述所有方法都是等效的.我更喜欢f()因为=单独使用方法签名后缺少运算符对我来说已经足够了.: Unit当您想要额外记录方法时使用显式.最后一种形式令人困惑,实际上被视为的警告.

=操作是至关重要的.如果它存在,则表示:" 请返回方法体中最后一个语句返回的内容 ".显然你不能将这种语法用于abstract方法.如果不是,Unit则假定.

  • 如果你的函数返回`Unit`,你可以省略`=`符号.任何函数定义没有`=`符号返回`Unit` (2认同)

Hei*_*ger 14

过程的特殊语法(返回Unit的方法)是一个错误.不要使用它.对于具有Java/C(++)背景的初学者来说,这是令人困惑和危险的.这是一种不必要的特殊待遇.始终使用等号,有和没有类型推断(后者应该只用于私人成员):

def foo(): Unit = someCodeReturningUnit()

private def bar() = someCodeReturningUnit()
Run Code Online (Sandbox Code Playgroud)


Dan*_*ral 6

Scala社区对此有所分歧.一方面,不使用显式返回类型意味着您可以轻松地忘记=符号,这会导致通常很难跟踪的错误.另一方面,Unit具有不同语法的返回方法将它们放在一个单独的类别中,这让一些人感到高兴.

就个人而言,我宁愿这种语法会消失 - 因缺失= 导致的错误令人讨厌.但它甚至都没有被弃用,所以我宁愿利用它而不仅仅是遭遇它存在的问题.

所以,使用你想要的任何东西.无论是哪种方式都会批评你的选择,人们无论如何都会赞美它.