2

delayedDavid Pollak's で例を見ました"Beginning Scala"。試行錯誤しながら、それを適応させようとしました。ここに私が持っているものがあります:

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

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

delaying(sayhello())

パラメータを取る関数/メソッドをどのように遅らせますか? を呼び出すときに括弧を使用できないのはなぜtですか? 関数の遅延に関するドキュメントはどこにありますか?

4

2 に答える 2

5

t関数値である必要はありません。に評価されるのは、単に名前で渡された値ですUnit

関数で指定する場合tdelayingそのパラメーターとして渡された関数を明示的に呼び出しているわけではありません。それを述べることにより、名前で渡されたパラメーターが評価されるように強制されますsayhello()。つまり、その時点で評価されます。

名前で渡されたパラメーターの関数でパラメーターを使用できない理由はありません。

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

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

delaying(say("hello"))

t内部にパラメーターをアタッチするのはdelaying、その戻り型が(ではUnitなく)パラメーターを受け取る関数型である場合のみです。

于 2009-12-15T17:33:03.240 に答える
1

私はひどい記憶を持っており、答えには、1つ以上の引数を取る関数を生成する名前別パラメーターを実際に宣言する方法の例が提供されていないため、これを思いつきました:

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

}
于 2010-05-16T09:43:32.597 に答える