【问题标题】:Is throwing exceptions in Scala considered a side-effect?在 Scala 中抛出异常是否被视为副作用?
【发布时间】:2016-05-13 07:40:33
【问题描述】:

代码如下:

val prices = cars map (car => {
  val price = car.getPrice
  Logger.info(s"Car price is $price")
  price
})

在上述情况下使用括号很好,或者有严格的英制使用花括号,如下所示:

val prices = cars map { car => {
  val price = car.getPrice
  Logger.info(s"Car price is $price")
  price
}}

我不喜欢两个花括号,更喜欢({ ... }) 样式,但另一位开发人员警告说内部函数有副作用(记录消息)并且是 3 行代码,因此它必须与两个花括号一起使用并且整个 Scala 社区在这些情况下都使用双花括号。

我搜索了 scala 代码并找到了this one

def failed: Future[Throwable] =
  transform({
    case Failure(t) => Success(t)
    case Success(v) => Failure(new NoSuchElementException("Future.failed not completed with a throwable."))
  })(internalExecutor)

它有多行但没有副作用,这里使用了我很好的符号({...})。当代码包含副作用时是否应该更改它?我个人不喜欢这样,即使整个社区都说“是的,使用双花括号!” :)

【问题讨论】:

    标签: scala


    【解决方案1】:

    在你的特殊情况下,我实际上只使用花括号而不使用括号:

    val prices = cars map { car =>
      val price = car.getPrice
      Logger.info(s"Car price is $price")
      price
    }
    

    您在 scala 代码中发布的示例仅在必要时使用括号,因为 transform 实际上是一个具有多个参数列表的函数(即transform(args1)(arg2))。

    我没有听说过任何将副作用代码与特定选择的块分隔符相关的约定((){}),但我确实发现我更喜欢 {} 的外观,因为其中有多行那个块。

    【讨论】:

      【解决方案2】:

      我从未听说过在代码块中存在副作用时应该使用花括号。对单个语句使用 (),对多个语句使用 {}。你所谓的好符号({...}) 完全没问题。

      【讨论】:

        猜你喜欢
        • 2012-10-13
        • 1970-01-01
        • 2013-11-22
        • 2019-09-29
        • 2011-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多