【发布时间】:2013-11-26 18:09:30
【问题描述】:
在 Scala 中,为什么在使用 TraversableOnce 中的 toSet 功能时会出现以下情况?
如果您使用以下代码创建工作表(在 IntelliJ 中),您将获得以下输出(注意:使用 Scala 2.10.2):
val maps = List(List(1,2),List(3,4),List(5,6,7),List(8),List())
maps.flatMap( _.map( _ + " " ) )
maps.flatMap( _.map( _ + " " ) ).toSet
maps.flatMap( _.map( _ + " " ) ).toSet()
即res4 产生一个布尔值
> maps: List[List[Int]] = List(List(1, 2), List(3, 4), List(5, 6, 7), List(8), List())
> res2: List[String] = List("1 ", "2 ", "3 ", "4 ", "5 ", "6 ", "7 ", "8 ")
> res3: scala.collection.immutable.Set[String] = Set("3 ", "8 ", "4 ", "5 ", "1 ", "6 ", "2 ", "7 ")
> res4: Boolean = false
不用说我很困惑很长时间,直到我注意到 toSet 在实现中不使用括号,但为什么是布尔值?
【问题讨论】:
-
查看编译后的字节码,实际发生了什么——结果集的 apply 方法被使用 Unit 参数调用,但无法说明原因。看起来像一个错误,因为如果我尝试在 res3 上调用
(),它是不可重现的
标签: scala