كيف تحدد المعلمة المتأخرة (حسب الاسم) التي تقبل دالة تأخذ المعلمات؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

رأيت delayed مثال في ديفيد بولاك "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