2010-07-29 27 views

उत्तर

29

आप एक फ़ंक्शन प्रकार वापस कर सकते हैं (यह A => B द्वारा परिभाषित किया गया है)। इस मामले में Int Int:

scala> def f(x:Int): Int => Int = { n:Int => x + n } 
f: (x: Int)(Int) => Int 

जब आप फ़ंक्शन को कॉल करते हैं तो आपको एक नया फ़ंक्शन मिलता है।

scala> f(2) 
res1: (Int) => Int = <function1> 

जो एक सामान्य समारोह के रूप में कहा जा सकता है:

scala> res1(3) 
res2: Int = 5 
7

एक तरह से (कुछ कार्यात्मक वस्तु उन्मुखीकरण के लिए अद्वितीय) आप उच्च आदेश कार्यों का उपयोग कर सकते हैं वस्तुओं के बीच ढीला कपलिंग्स तैयार करना है।

नीचे दिए गए उदाहरण में Alarm में एक विधि check4Danger() है जो जांच करता है कि गणना की गई मान DangerLevel से अधिक है या नहीं। अलार्म क्लास उन वस्तुओं के बारे में कुछ नहीं जानता जो इसे कॉल करते हैं।

Car कक्षा में एक विधि engineCrashRisk() है जो एक अज्ञात फ़ंक्शन देता है जो इंजन क्रैश के जोखिम की गणना करता है। Car अलार्म की निर्भरता नहीं है।

case class Alarm(temperature: Double, pressure: Double){ 
    val DangerLevel = 100000.0 
    def check4Danger(f: (Double, Double) => Double): Boolean = { 
    val risk = f(temperature, pressure) 
    if(risk > DangerLevel){ 
     println("DANGER: "+ risk) 
     true 
    }else{ 
     println("Safe: " + risk) 
     false 
    } 
    } 
} 

case class Car(fuelRate: Double, milage: Int){ 
    def engineCrashRisk() = 
    (temperature: Double, pressure: Double) => 
     temperature * milage + 2*pressure/fuelRate 
} 


val car = Car(0.29, 123) 
val riskFunc = car.engineCrashRisk 

val alarm = Alarm(124, 243) 
val risk = alarm.check4Danger(riskFunc) 

इस स्क्रिप्ट का आउटपुट है:

Safe: 16927.862068965518 

इस उदाहरण में हम Alarm और Car वस्तुओं के बीच निर्भरता मुक्त विधि कॉल बनाने के लिए बंद होने के साथ गुमनाम कार्यों के लिए इस्तेमाल किया। क्या यह उदाहरण कोई समझ में आता है?

+0

+ 1, ऑफटॉपिक एक तरफ: कृपया 'DANGER_LEVEL' को 'डेंजरलेवल' में बदलें। ओडर्स्की पुस्तक स्थिरांक के लिए पास्कलकेस के उपयोग की सिफारिश करती है। – missingfaktor

+4

@ Rahuλ कोई बकवास नहीं! यह सिफारिश पूरी तरह से अपरंपरागत महसूस करती है, लेकिन मैं अपने महान नेता की इच्छा पर सवाल करने के लिए कौन हूं :-) –

संबंधित मुद्दे