我想在Scala中编写相同的Java代码:
final Object foo;
if (/*...*/) {
foo = /* something */;
} else {
foo = /* something else */;
use(foo);
}
useDifferently(foo);
我正在寻找Scala中的等价物。我不能让变量在首次使用之前未初始化(无论是val
还是var
),所以我不得不写一些类似
val foo = if (/*...*/) {
/* something */
} else {
val tmp = /* something else */
use(tmp)
tmp
}
useDifferently(foo)
我发现需要临时变量而不是优雅。请告诉我优雅的方式。
答案 0 :(得分:2)
没有办法直接编写类似于Java代码的Scala代码,但是通过对其进行重组以实现更大的关注点分离,可以使其更加优雅。目前,条件执行两件事:为foo分配值,并且可能执行副作用。将这两个问题分开将产生如下代码:
val conditionIsSatisfied = /*...*/
val foo = if (conditionIsSatisfied) {
/* something */
} else {
/* something else */
}
if (conditionIsSatisfied) {
use(foo)
}
useDifferently(foo)
答案 1 :(得分:1)
val foo = if (/*...*/) {
/* something */
} else {
/* something else */ match { case v => use(v); v}
}
useDifferently(foo)
答案 2 :(得分:1)
你实际上是想在scala中使用java代码,而不是将命令式开发成功能。你需要这样写:
val foo = if (/*...*/) {
/* something */
} else {
use(/* something else */)
}
useDifferently(foo)
使用"使用()"返回更新的foo对象。