Moh*_*han 8 mapping dictionary scala lazy-evaluation
我打电话的时候
System.err.println("Before")
System.err.flush()
val foo: Map[Int, T] = t mapValues (fn(_))
System.err.println(foo.head) //prevent optimiser from delaying the construction of 'foo'
System.err.println("After")
System.err.flush()
Run Code Online (Sandbox Code Playgroud)
与fn
里面有一个调试打印语句,我得到这样的输出:
Before
...head item...
After
...debug print statement from fn...
...debug print statement from fn...
Run Code Online (Sandbox Code Playgroud)
我不明白为什么在打印"After"之后调用调试打印语句,我不明白为什么我得到它两次---除非mapValues
创建一个懒惰的地图?
Mic*_*jac 12
是的.它映射到一个中间类,该中间类fn
在访问(一次又一次)之前保持并且不进行评估.
def mapValues[W](f: V => W): Map[K, W] = new MappedValues(f)
Run Code Online (Sandbox Code Playgroud)
map
如果您不想进行延迟评估,请使用严格.那是:
collection map { case (k, v) => (k, fn(v)) }
Run Code Online (Sandbox Code Playgroud)
请记住,MappedValues
实现会在每次访问时评估函数 - 与lazy val
仅评估一次的Scala不同.单步执行代码时,您可能会看到输出两次.扩展val foo
调试器窗口将迭代值,调用函数fn
并生成调试输出.
如果您提供地图t
和功能的代码fn
,那么我们可能会提供帮助.