有人可以解释一下REPL的以下输出吗?
我正在定义2个(无限)流,否则它们的定义相同,只是前面有地图.一个定义中的(句点)和另一个定义中的_ _(空格).
我可以看到这会导致map绑定不同,但是第二个定义的输出中的1会发生什么?
谢谢.
scala> lazy val infinite: Stream[Int] = 1 #:: infinite.map(_+1)
infinite: Stream[Int] = <lazy>
scala> val l = infinite.take(10).toList.mkString(",")
l: String = 1,2,3,4,5,6,7,8,9,10
scala> lazy val infinite2: Stream[Int] = 1 #:: infinite2 map(_+1)
infinite2: Stream[Int] = <lazy>
scala> val l2 = infinite2.take(10).toList.mkString(",")
l2: String = 2,3,4,5,6,7,8,9,10,11
Run Code Online (Sandbox Code Playgroud)
Tom*_*icz 11
这是关于方法关联性的.这个:
1 #:: infinite.map(_+1)
Run Code Online (Sandbox Code Playgroud)
这很简单:
1 #:: infinite2 map(_+1)
Run Code Online (Sandbox Code Playgroud)
由编译器解释为:
(1 #:: infinite2) map(_+1)
Run Code Online (Sandbox Code Playgroud)
1 #:: infinite2是您想要的流,但在您返回之前,您应用延迟转换,为每个项添加一个.这就解释了为什么1从来没有出现作为一个结果-转型成为后2.
有关更多详细信息,请参阅:Scala中的运算符优先级.由于#不是特殊字符,因此对其进行同等对待map,因此从左到右对方法进行评估.