0

我是 Scala 的新手,正在玩惰性求值,偶然发现了这个问题:如果我想让val c的惰性求值有效,我必须在c的声明之前编写虚拟变量ab,这我认为样板文件太多。我试图在没有初始初始化的情况下声明ab惰性值,但编译器抱怨。如果我写类似:也不起作用。 lazy val c = a:Double, b:Int

有没有办法摆脱这些虚拟变量?我可以用更优雅的方式重构这段代码吗?

  var a = 0d;                                     //> a  : Double = 0.0
  var b = 0;                                      //> b  : Int = 0
  lazy val c = a / b                              //> c  : Double = <lazy>
  //some other code...
  a = math.Pi
  b = -1
  (1 to 10).foreach(x => println(f"$x, ${x * c}%.8s"))
                                                  //> 1, -3.14159
                                                  //| 2, -6.28318
4

2 回答 2

6

我没有看到“其他代码”,但 var 通常是 scala 中的一种不好的代码气味。为什么不做这样的事情

lazy val c = {
  val a = ...
  val b = ...
  ...computation with a & b ...
}
于 2014-09-25T00:18:43.680 回答
2

将您的语句块变成模板。

scala> :pa
// Entering paste mode (ctrl-D to finish)

class X {
lazy val c = a / b
//stuff
val a = math.Pi
val b = -1
(1 to 10).foreach(x => println(f"$x, ${x * c}%.8s"))
}

// Exiting paste mode, now interpreting.

defined class X

scala> new X
1, -3.14159
2, -6.28318
3, -9.42477
4, -12.5663
5, -15.7079
6, -18.8495
7, -21.9911
8, -25.1327
9, -28.2743
10, -31.4159
res0: X = X@61c4eee0
于 2014-09-25T01:14:58.213 回答