【问题标题】:Should I use Unit or leave out the return type for my scala method?我应该使用 Unit 还是省略我的 scala 方法的返回类型?
【发布时间】:2012-03-16 17:46:36
【问题描述】:

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

谁能给点建议?

【问题讨论】:

    标签: scala void return-type


    【解决方案1】:

    Scala 社区对此存在分歧。一方面,不使用显式返回类型意味着您很容易忘记= 符号,这会导致经常令人讨厌的错误跟踪。另一方面,Unit-returning 具有不同语法的方法将它们放在一个单独的类别中,这让一些人感到高兴。

    就个人而言,我宁愿这种语法消失——由于缺少= 而导致的错误 很烦人。但它甚至没有被弃用,所以我宁愿利用它,也不愿忍受它存在的问题。

    所以,随心所欲地使用。无论哪种方式,都会有人批评您的选择,也有人会赞扬您的选择。

    【讨论】:

      【解决方案2】:

      隐式Unit返回类型:

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

      显式Unit 返回类型:

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

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

      def h() = println("ABC")
      

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

      = 运算符至关重要。如果存在,则表示:“请返回最后一条语句返回的任何内容”在方法主体中。显然,您不能将此语法用于abstract 方法。如果不是,则假定为Unit

      【讨论】:

      • 谢谢托马斯。您共享的代码引发了另一个问题:为什么允许您在 fg 中省略 = 登录?
      • 如果你的函数返回Unit,你可以省略=符号。任何没有= 符号定义的函数都会返回Unit
      • 因为在Unit 函数中= 是可选的。但是,对于所有其他类型,这是强制性的,因为它们实际上会返回一些东西
      • 如果您明确指定返回类型(无论这种类型是什么),您必须使用= 符号。因此def g(): Unit {println("ABC")} 不能编译,但 def g(): Unit = {println("ABC")} 可以!仅供参考,这里是style guide 的链接。
      • “显式优于隐式”。我遵循这个原则。
      【解决方案3】:

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

      def foo(): Unit = someCodeReturningUnit()
      
      private def bar() = someCodeReturningUnit()
      

      【讨论】:

      • 如果您对“不必要的特殊处理”的看法是正确的,则应该更新style guide section
      • @agilesteel 关于该部分一直存在争议。
      • 风格指南says:“避免使用过程语法,因为它往往会因为简洁而造成混淆。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 2021-03-11
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      相关资源
      最近更新 更多