2015-01-13 2 views
3

: 나는 그것을 호출 할 때스칼라 게으른 발 캐싱

def maybeTwice2(b: Boolean, i: => Int) = { 
    lazy val j = i 
    if (b) j+j else 0 
} 

왜 하이 두 번 인쇄되지 않습니다 좋아 :

maybeTwice2(true, { println("hi"); 1+41 }) 

이 예는 스칼라의 책 "기능적 프로그래밍에서 실제로 "왜"안녕하세요 "가 두 번 인쇄되지 않는 이유는 저에게 충분히 설득력이 없습니다. 그래서 여기에서 이것을 묻는 것을 생각했습니다!

+0

답변을 수락하거나보다 자세한 설명을 부탁드립니다. –

+0

왜 "이유가" "설득력이 없다"는 것을 알 수없는지는 분명하지 않습니다. 'i'는 함수입니다. 'maybeTwice2'는 한 번 참조 (호출)합니다. 왜 처음부터 두 번 부르기를 기대합니까? – Dima

+0

나는 당신이 책에 있었던 것에 대한 설명을 기대했을 것입니다. 그것은 나에게 훨씬 더 의미가 있습니다! – sparkr

답변

4

그래서 i은 정수를 올바르게 부여하는 함수입니까? 메서드를 호출하면 b을 true로 전달하고 if 문의 첫 번째 분기가 실행됩니다.

ji으로 설정되고 나중에 나중에 계산에 사용되면 "hi"를 인쇄하고 결과 값 1 + 41 = 42을 캐싱하는 기능이 실행됩니다. 두 번째로 사용 된 결과 값은 이미 계산되어 있으므로 lazy val j 때문에 함수를 두 번 계산할 필요없이 함수가 84를 반환합니다.

3

SO answer은 게으른 val이 내부적으로 구현되는 방법을 탐색합니다. j + j에서 j은 게으른 val로 게으른 val의 정의를 위해 제공하는 코드를 실행하는 함수이며, 정수를 반환하고 이후 호출을 위해 캐시합니다. 따라서 hi을 인쇄하고 1+41 = 42을 반환합니다. 그런 다음 두 번째 j이 계산되고 동일한 함수가 호출됩니다. 이 시간 외에는 코드를 실행하는 대신 캐시에서 값 (42)을 가져옵니다. 그런 다음 두 개의 정수가 추가됩니다 (84를 반환).

관련 문제