복붙노트

[SCALA] 스칼라 mapValues ​​게으른인가?

SCALA

스칼라 mapValues ​​게으른인가?

언제 전화

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()

FN은 디버그 인쇄 문 내부를 갖는,이 출력을 얻을 :

Before
...head item...
After
...debug print statement from fn...
...debug print statement from fn...

디버그 인쇄 문이 인쇄 된 "후"다음에 호출되는 이유를 이해하지 않으며, mapValues ​​게으른 맵을 작성하지 않는 한 나는 --- 두 번 받고 있어요 왜 이해가 안 돼요?

해결법

  1. ==============================

    1.예 그렇습니다. 그것은 FN 보유 및 액세스 할 때까지 (또 다시) 평가하지 않는 중간 클래스에 매핑합니다.

    예 그렇습니다. 그것은 FN 보유 및 액세스 할 때까지 (또 다시) 평가하지 않는 중간 클래스에 매핑합니다.

    def mapValues[W](f: V => W): Map[K, W] = new MappedValues(f)
    

    당신이 게으른 평가를하지 않으려면 엄격한지도를 사용합니다. 그건:

    collection map { case (k, v) => (k, fn(v)) }
    
  2. ==============================

    2.이 평가하여 한 번만 스칼라 게으른 발에서 다른 - MappedValues ​​구현은 모든 액세스의 기능을 평가 있음을 유의하십시오. 코드를 단계별로 때 두 배의 출력을 볼 수 있습니다. , 값을 반복합니다 디버거 창에서 발 foo는 확장 기능 (FN)를 호출하고 디버그 출력을 생성.

    이 평가하여 한 번만 스칼라 게으른 발에서 다른 - MappedValues ​​구현은 모든 액세스의 기능을 평가 있음을 유의하십시오. 코드를 단계별로 때 두 배의 출력을 볼 수 있습니다. , 값을 반복합니다 디버거 창에서 발 foo는 확장 기능 (FN)를 호출하고 디버그 출력을 생성.

    당신이지도의 t 및 기능 FN에 대한 코드를 제공하는 경우, 우리는 도움을 줄 수 있습니다.

  3. from https://stackoverflow.com/questions/39474314/is-scala-mapvalues-lazy by cc-by-sa and MIT license