2012-02-27 59 views

回答

46

Unit返回类型:

def f() {println("ABC")} 

明确Unit返回类型:从最后的方法表达推断,仍然Unit因为这是println类型

def g(): Unit = {println("ABC")} 

返回类型,但令人困惑:

def h() = println("ABC") 

以上所有方法都是等效的。我更喜欢f(),因为在方法签名之后缺少=运算符就足够了。当您想额外记录该方法时,请使用明确的: Unit。最后一种形式令人困惑,实际上在中被视为警告。

=运营商是至关重要的。如果存在,则意味着:“请返回方法正文中最后一条语句返回”的任何内容。很明显,你不能在abstract方法中使用这个语法。如果不是,则假定Unit

+0

感谢Tomasz。你共享的代码引发了另一个问题:为什么你可以忽略'f'和'g'中的'='符号? – balteo 2012-02-27 08:26:34

+2

如果你的函数返回'Unit',你可以省略'='符号。任何没有'='符号的函数都会返回'Unit' – Nicolas 2012-02-27 08:32:42

+1

因为在'Unit'函数中'='是可选的。但是对于所有其他类型,这是强制性的,因为它们实际上返回了一些东西 – 2012-02-27 08:32:45

14

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

def foo(): Unit = someCodeReturningUnit() 

private def bar() = someCodeReturningUnit() 
+1

如果你是[风格指南部分](http://docs.scala-lang.org/style/types.html#void_methods)应该更新正确的“不必要的特殊待遇”。 – agilesteel 2012-02-27 09:19:56

+0

@agilesteel关于该部分一直存在争议。 – 2012-02-27 13:24:22

+0

风格指南[说](http://docs.scala-lang.org/style/declarations#procedure-syntax):“避免使用过程语法,因为它往往会让人感到困惑,因为在简洁中收获甚微。” – 2016-05-17 17:47:19

6

斯卡拉社区划分了。一方面,不使用明确的返回类型意味着您可以轻松地忘记标记,这会导致通常令人讨厌的错误跟踪。另一方面,Unit - 具有不同语法的返回方法将它们放在一个单独的类别中,这让一些人感到高兴。

就个人而言,我宁愿这句法会消失 - 从失踪=产生的误差恼人的跟踪。但它甚至没有被废弃,所以我宁愿利用它,而不仅仅是承受它存在的问题。

所以,使用任何你想。无论哪种方式都会有人批评你的选择,并且人们赞美它。