Scala:没有var的分支指令?

时间:2017-04-30 11:32:00

标签: scala

scala中的分支指令最佳做法是什么?

假设我有这段代码:

val initial  = Something(...)
val afterOp1 = initial.op1()
val afterOp2 = afterOp1.op2()
val result   = afterOp2.op3()

但现在op2有两个选项:op2aop2b

我可以使用var轻松编写代码:

val initial  = Something(...)
val afterOp1 = initial.op1()
var afterOp2 = Nil
if (useA) {
  afterOp2 = afterOp1.op2a()
} else {
  afterOp2 = afterOp1.op2b()
}
val result = afterOp2.op3()

但后来我失去了不变性。另一种没有变量的解决方案是

val initial  = Something(...)
val afterOp1 = initial.op1()
var afterOp2 = Nil
if (useA) {
  val afterOp2 = afterOp1.op2a()
  val result   = afterOp2.op3()
} else {
  val afterOp2 = afterOp1.op2b()
  val result   = afterOp2.op3()
}

但这显然是不受欢迎的,因为我必须重复代码。

这里的最佳做法是什么?我有一种感觉,我忽略了一些简单的事情

3 个答案:

答案 0 :(得分:5)

Scala中if-else的一个不错的属性是expression,它返回一个值。

假设op2aop2b产生相同类型,您可以做的最简单的事情是:

val initial  = Something(...)
val afterOp1 = initial.op1()
val afterOp2 = if (useA) afterOp1.op2a() else afterOp1.op2b()
val result = afterOp2.op3()

答案 1 :(得分:2)

另一种方法是使用模式匹配:

val afterOp2 = useCase match {
  case useA => afterOp1.op2a()
  case useB => afterOp1.op2b()
}

这样你可以支持两个以上的用例。

答案 2 :(得分:0)

我不确定你想要实现什么,但你可以按如下方式处理整个if表达式:

val afterOp2 = if (useA) {
  afterOp2 = afterOp1.op2a()
} else {
  afterOp2 = afterOp1.op2b()
}

如果你在谈论期货和成功/失败,那么还有更优雅的选择