매개 변수를 사용하는 함수를 수락하는 지연된 (이름 별) 매개 변수를 어떻게 정의합니까?
-
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() )
}
}
제휴하지 않습니다 StackOverflow