2017-12-29 4 views
1

신참 같은 실수가 들리 겠지만 나는 그렇게 많이한다. 게으른 평가 된 블록이나 값을 함수에 전달하는 동안, 내가 어떻게 든 잊어 버리면, 그 함수의 대응하는 매개 변수가 게으름 (이름으로 전달/호출)을한다. 왜냐하면 이 약간의 혼란을 야기하기 때문이다.스칼라에서 느린 인수 전달에 도움이 있습니까?

lazy val a = {println("a");1} 
def myfunc(b:Int){println("hello")} 
myfunc(a); 

출력 :

a 
Hello 

그래서 내 질문이 문제에 대한 컴파일러의 도움 (플래그 등)가 아니면 이것이 내가 알아서해야 일의 종류?

+0

컴파일러는'=> Int'를 의미했지만 Int를 썼다고 감지 할 수 있습니까? –

+0

해당 함수로 전달되는 매개 변수는 게으르거나 없음으로 표시됩니다. – altayseyhan

+1

지연된 변수를 값으로 함수에 전달하는 것은 다른 방식으로 사용하는 것과 전혀 다릅니다. 어떤 시점에서 평가가 이루어져야합니다. 컴파일러는 어떻게 일어나고 있는지, 실제로 일어난 곳이 어디인지를 결정할 수 있습니다 - 그것이 문제입니다. – Dima

답변

1

문제를 시스템으로 옮길 수 있습니다.


class Lazy[A](body: => A) { 
    lazy val value = body 
} 

object Lazy { 
    def apply[A](body: => A) = new Lazy[A](body) 
} 

지금 당신이 약간의 도움이있을 것이다 :

  1. lazy val가의 명시 적, 대신 ...
  2. 가 게으르게 평가 값 상자를 정의 사용하지 마십시오 컴파일러에서 :

    val a = Lazy { 
        println("a") 
        1 
    } 
    
    def myfunc(b: Lazy[Int]) = { 
        println("hello") 
    } 
    
    myfunc(a) // ok, and it doesn't print "a" since it never uses it 
    // myfunc(42) // won't compile 
    
    def myfunc2(b: Int) = b + 42 
    
    // myfunc2(a) // does not compile 
    myfunc2(a.value) // ok, explicitly evaluate - or consider refactoring myfunc2 
    
관련 문제