scala yield会产生意外结果

时间:2016-08-11 07:56:11

标签: scala yield

我尝试使用两个版本的代码来了解scala中的yield如何工作。我无法理解为什么我得到两个不同的结果

在这个版本中,我调用yield,表达式只是乘以2.我得到了前10的倍数为2的向量。这对我来说很有意义

scala> val r = for (j <- 1 to 10) yield {
     | (j*2).toString //multiply by 2
     | }
r: scala.collection.immutable.IndexedSeq[String] = Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20) // got multiples of 2. This looks ok

有趣的是在这个版本中,我所做的就是将val中的乘法乘以2。但现在我得到一个空的矢量!这是为什么?

scala> val r = for (j <- 1 to 10) yield {
     | val prod = (j*2).toString //multiply by 2 but store in a val
     | }
r: scala.collection.immutable.IndexedSeq[Unit] = Vector((), (), (), (), (), (), (), (), (), ())  //this is empty

我认为val prod =(j * 2).toString可能导致单元结果但是当我尝试在scala解释器上执行独立表达式时,我可以看到prod是一个String

scala> val prod = 2.toString()
prod: String = 2

1 个答案:

答案 0 :(得分:0)

在Scala中,每个表达式都会返回一些内容。但由于性能原因,分配旨在返回Unit(请参阅What is the motivation for Scala assignment evaluating to Unit rather than the value assigned?)。

在您的代码段中,在最后一个示例中,REPL说prod: String = 2,意味着prod有一些价值,这是为了您的方便。但请尝试{ val prod = 2.toString() }

scala> { val prod = 2.toString() }

scala> println(res0)
()

()Unit类型的唯一可能值。

(我不确定为什么res0在第一次之后没有显示,因为resN - 类似于REPL中的值会收集所有未分配的显式结果)