매개 변수를 사용하는 함수를 수락하는 지연된 (이름 별) 매개 변수를 어떻게 정의합니까?

StackOverflow https://stackoverflow.com/questions/1909026

  •  19-09-2019
  •  | 
  •  

문제

나는 ~를 봤다 delayed David Pollak의 예 "Beginning Scala". 나는 시행 착오로 그것을 조정하려고 노력했다. 다음은 다음과 같습니다.

def sayhello() = {
  println("hello")
}

def delaying(t: => Unit):Unit = {
  println("before call")
  t
  println("after call")
}

delaying(sayhello())

매개 변수를 취하는 함수/메소드를 어떻게 지연시겠습니까? 내가 전화 할 때 파란스 테스를 사용할 수없는 이유는 무엇입니까? t? 기능 지연에 대한 자세한 내용은 어디에서 찾을 수 있습니까?

도움이 되었습니까?

해결책

t 함수 값 일 필요는 없습니다. 그것은 단순히 평가하는 이름 별 값입니다 Unit.

당신이 말할 때 t 에서 delaying 함수, 당신은 그 매개 변수로 전달 된 함수를 명시 적으로 호출하지 않습니다. 그것을 말함으로써, 당신은 전달 된 이름 별 매개 변수를 평가하도록 강요하고 있습니다. sayhello() 그 시점에서 평가됩니다.

전달 된 이름 별 매개 변수에서 함수에서 매개 변수를 사용할 수없는 이유는 없습니다.

def say(word: String) {
  println(word)
}

def delaying(t: => Unit) {
  println("before call")
  t
  println("after call")
}

delaying(say("hello"))

매개 변수를 첨부하는 유일한 시간 t 내부에 delaying 반환 유형이 아닌 경우 ( Unit 그러나) 함수 유형을 취하는 매개 변수.

다른 팁

끔찍한 메모리가 있고 답은 하나 이상의 인수를 취하는 함수를 산출하는 이름 별 매개 변수를 실제로 선언하는 방법을 제공하지 않기 때문에 다음과 같이 생각해 냈습니다.

object DelayedEvalTest {

    private class DelayedFunction extends Function1[Int,Unit] {

        override def apply(x:Int) : Unit = {}

        println("function created")
    }

    private def eval(eval:Boolean, op : Int => Unit ) {
        println("in eval()")
        if ( eval ) {
            op( 42 )
        }
    }

    private def evalDelayed(eval:Boolean, op : => Int => Unit ) {
        println("in evalDelayed()")
        if ( eval ) {
            op( 42 )
        }
    }

    def main(args:Array[String]) {
        eval( false , new DelayedFunction() )
        evalDelayed( false , new DelayedFunction() )
    }

}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top