【问题标题】:Scala syntax for do-nothing function?什么都不做的函数的Scala语法?
【发布时间】:2011-09-05 11:04:15
【问题描述】:

在 Scala 中是否有一些标准方法可以指定一个什么都不做的函数,例如在实现一个 trait 时?这有效:

trait Doer {
  def doit
}

val nothingDoer = new Doer {
  def doit = { }
}

但也许有一些更合适的方式来表达nothingDoer?

编辑 出现了一些有趣的答案,作为回应,我在问题中添加了一些内容。首先,事实证明我可以在 Doer 中使用默认实现。很好的提示,但你并不总是想要那个。其次,显然一种更惯用的写作方式是:

val nothingDoer = new Doer {
  def doit { }
}

第三,虽然没有人确切建议,但我发现这似乎也有效:

val nothingDoer = new Doer {
  def doit = Unit
}

这是一个不错的选择吗?

(我认为一些人建议的“:Unit”并没有真正添加任何东西。)

【问题讨论】:

  • 这更像是定义一个特征,而不是实现它
  • 响应您的编辑,我认为def doit = Unit 没有任何意义。 UnitUnit 类型的单例对象。你不妨说def doit = 42def doit = ListBuffer,因为它们也可以。

标签: scala


【解决方案1】:

由于您的返回类型是 Unit,因此通常不使用 =

val nothingDoer = new Doer {
  def doit {}
}

【讨论】:

  • 真的吗?那不是我的印象……
  • @njlarsson Ya rly。请参阅codecommit.com/scala-style-guide.pdf 方法声明部分
  • 这也是一个特别非传统的用例。该“约定”在很大程度上基于相当合理的假设,即您的方法实际上将包含一些代码,并且特别不适合此用例。除此之外,风格 guide 只提供指导,而不是严格的教条 - 你真的想让Unit返回类型在这里更加明确,它更好地自我记录你是做一些不寻常且有点傻的事情。
【解决方案2】:

我不知道这样做更惯用的方式(我认为没有相当于 Python 'pass' 的方法)。

但您可以使用“Unit”来指定方法在 Trait 中不返回任何内容:

def doit: Unit

【讨论】:

  • 其实这个是默认的,没什么区别。
  • 它在可读性方面很重要(并且在课堂上非常重要),恕我直言。
  • 我一直在寻找一个类似于 python 的 pass 的占位符函数语法,不是因为我想要什么都不做的函数,而是因为我想在实现它们之前规划函数和测试,并拥有项目仍然编译,以便 sbt console 等仍然有效。我知道这些的一些类型签名,所以如果我指定这些,Unit 将不起作用。我想我可以只使用 Unit 并在 TODO 注释中记下我的类型签名。我可能只是不习惯 scala。
【解决方案3】:

如果你经常有“什么都不做”的对象,你也可以把“什么都不做”作为默认实现:

trait Doer {
  def doit {}
}

val nothingDoer = new Doer

【讨论】:

    【解决方案4】:

    基本上你想要这样的东西:

    trait Doer {
        def doit : Unit
    }
    

    您也可以考虑查看类型 Option。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 2012-08-21
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多