在两个分支中初始化局部变量

时间:2016-02-04 13:40:33

标签: scala

我想在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)

我发现需要临时变量而不是优雅。请告诉我优雅的方式。

3 个答案:

答案 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对象。