【问题标题】:Scala - Option Type Var ManipulationScala - 选项类型 Var 操作
【发布时间】:2015-06-23 15:38:52
【问题描述】:

我正在做一个在线练习来练习选项和线程,我对这两个方面的经验都很少。在线练习附带了一个测试套件,所以现在我正在尝试让我的 Option 测试用例通过,然后再转到线程测试用例。

这是我的代码:

case class BankAccount() {
  def getBalance = account.balance

  def incrementBalance(amount: Int): Option[Int] = {
    account.balance = Some(account.balance.get + amount)
    getBalance
  }

//  def closeAccount(): Option[Int] = {
//    account.balance = None: Option[Int]
//  }
}

object account {
  var balance = Some(0)
}

我已将 closeAccount() 注释掉,因为它目前给我一个错误,说它期待类型 Some[Int] instead of Option[Int]。考虑到我如何初始化balance,这是可以理解的。我不知道如何从Some[Int] 的值转到None,如closeAccount() 所示。

如果能解决这个问题,我们将不胜感激。提前谢谢你。

第一次编辑:我发现我在使用incrementBalance 时犯了什么愚蠢的错误。由于getBalanceval,因此它不会在操作后重新计算值。不过在closeAccount() 上仍然迷路。

【问题讨论】:

  • 请注意,如果 balance 为 None,account.balance.get 将抛出异常(此调用本质上会扼杀使用 Option 的目的)。您最好将 Option 用作 incrementBalance 中的 monad,例如 account.balance.map(_ + amount)
  • 我确实遇到了这个问题!我后来重构了我的代码,使用case switch 来检查它是Some[Int] 还是None。不过也谢谢你的建议:)

标签: scala scala-option


【解决方案1】:

var balance = Some(0) 被推断为Some[Int] 类型,当您需要明确告诉它它是Option[Int] 类型时:

var balance: Option[Int] = Some(0)

然后balance 将能够接收Some(0)None

顺便说一句,有时总是使用Option(...) 而不是Some(...) 是一个好习惯。这是因为Some(null) 会变成Some(null)Option(null) 会变成None,这是我们通常想要的。

【讨论】:

  • 很简单,代表我的疏忽。感谢您的建议。它解决了这个问题,但现在我已经处理了它似乎还有一些东西需要篡改。
猜你喜欢
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
相关资源
最近更新 更多