2011-03-09 18 views
5

में हुक पैटर्न मैं स्कैला में सभी हुकों का संक्षिप्त दस्तावेज ढूंढ रहा हूं। एक हुक प्रोग्राम प्रवाह में कोई भी स्थिति है जहां आम व्यवहार को अवरुद्ध किया जा सकता है। ऐसी स्थितियों में शामिल हैं:स्कैला

  • वर्गों की घोषणा या लक्षण
  • तरीकों और क्षेत्रों धागे की
  • मिश्रण में करने के लिए उपयोग, विरासत

मैं एक रूबी पृष्ठभूमि से आ रहा हूँ जहाँ, के लिए उदाहरण के लिए, method_missing गैर-मौजूद विधि कॉल को अवरुद्ध करने की अनुमति देता है।

क्या ऐसे हुक स्कैला में उपलब्ध हैं?

मैथियस

+0

संबंधित नोट पर, http://stackoverflow.com/questions/3105594/is-there-a-method-missing-in-scala भी देखें – VonC

उत्तर

7

स्कैला 2.8 या उससे पहले में method_missing के बराबर नहीं है। स्कैला 2.9 (विकास के तहत) में, एक गतिशील विशेषता जोड़ा जाएगा। गतिशील विशेषता घोषित करने वाली वस्तुओं को अज्ञात विधि कॉल स्वचालित रूप से संकलक द्वारा अनुवादित किया जाएगा ताकि invokeDynamic पर कॉल किया जा सके। विचार है कि गतिशील रूप से टाइप की गई भाषाओं की कुछ शक्तियों को एक सुरक्षित और सौहार्दपूर्ण तरीके से प्राप्त करना है, बिना अनियंत्रित गतिशील टाइपिंग के प्रदर्शन ओवरहेड का भुगतान किए। स्काला के भीतर से गतिशील भाषाओं में परिभाषित वस्तुओं को कॉल करते समय यह अंतःक्रियाशीलता के मुद्दों को भी सरल बनाता है।

इसके अलावा, स्कैला में नए व्यवहार में झुकाव बड़े पैमाने पर क्लासिक विरासत के माध्यम से किया जाता है, या अंतर्निहित रूपांतरणों के माध्यम से वस्तुओं को नई कार्यक्षमता जोड़कर किया जाता है।

3

नहीं, वे नहीं हैं। स्थिर भाषाओं में, पहलू उन्मुख प्रोग्रामिंग का उपयोग कुछ उद्देश्यों के लिए किया जा सकता है। देखें Can I do Aspect Oriented Programming in Scala? लेकिन निश्चित रूप से, "कक्षाओं या लक्षणों की घोषणा" और "धागे, विरासत का मिश्रण" नियंत्रण प्रवाह का हिस्सा नहीं है। यदि आप उन्हें रोकना चाहते हैं, तो आपको इसके बजाय एक कंपाइलर प्लगइन की आवश्यकता होगी।

3

स्कैला आप जिस हुक के बारे में बात कर रहे हैं उसके बजाय बंद होने के उपयोग को प्रोत्साहित करने के लिए प्रेरित करता है (जिनमें से अधिकांश स्थिर टाइपिंग और संकलन के कारण आसानी से कार्यान्वित नहीं कर सकते हैं)।

इसके लिए आपको पहले से ही पता होना चाहिए कि आम व्यवहार में लचीलापन वांछित हो सकता है, लेकिन यह उपलब्ध होने पर बहुत शक्तिशाली और उपयोग करने में आसान है। उदाहरण के लिए, यदि आप एक विधि है कि लोगों के नाम बाहर प्रिंट है लगता है:

case class Name(first: String, last: String) { 
    def title = last + ", " + first(0).toUpper + "." 
} 
trait Familiar extends Name { 
    override def title = first + " " + last(0).toUpper + "." 
} 

def listing(names: Array[Name]) = names.foreach(name => println(name.title)) 

val jd1 = new Name("John","Doe) 
listing(Array(jd1)) // Prints Doe, J. 
val jd2 = new Name("John","Doe") with Familiar 
listing(Array(jd2)) // Prints John D. 

लेकिन अगर आप वास्तव में एक बहुत मुद्रण नाम बदलते करने जा रहे हैं, तो आप बेहतर निर्माण कर रहे हैं कि में:

case class Name(first: String, last: String) { 
    def title = last + ", " + first(0).toUpper + "." 
} 

def listing(names: Array[Name], address: Name => String = _.title) = 
    names.map(address).foreach(println) 

val jd = new Name("John", "Doe") 
listing(Array(jd)) // Uses default, so prints Doe, J. 
listing(Array(jd), n => n.first + " " + n.last(0).toUpper + ".") // Prints John D. 
1

स्कैला में ऐसी कोई बात नहीं है।

या, इसे अधिक सटीक रखने के लिए, स्थिर टाइपिंग सुनिश्चित करें कि हम जानते हैं कि कोड संकलित होने पर क्या होगा। ऐसा कोई भी हुक रन टाइम पर व्यवहार को बदल देगा, जो स्थैतिक टाइपिंग के उद्देश्य को हरा देगा।

कोई संकलन समय संकलन प्लगइन के माध्यम से, या क्लास लोडर के माध्यम से कक्षा लोड समय पर सामान भी बदल सकता है।