scala中的分支指令最佳做法是什么?
假设我有这段代码:
val initial = Something(...)
val afterOp1 = initial.op1()
val afterOp2 = afterOp1.op2()
val result = afterOp2.op3()
但现在op2有两个选项:op2a
,op2b
我可以使用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()
}
但这显然是不受欢迎的,因为我必须重复代码。
这里的最佳做法是什么?我有一种感觉,我忽略了一些简单的事情
答案 0 :(得分:5)
Scala中if-else
的一个不错的属性是expression,它返回一个值。
假设op2a
和op2b
产生相同类型,您可以做的最简单的事情是:
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()
}
如果你在谈论期货和成功/失败,那么还有更优雅的选择