2010-04-27 3 views
5

अपनी पुस्तक प्रोग्रामिंग में स्केला में (अध्याय 5 धारा 5.9 पृ 93) Odersky इस अभिव्यक्ति "bills !*&^%~ code!"क्या ओडर्सकी "बिल! * और ^% ~ कोड" के साथ गंभीर है?

उल्लेख एक ही पृष्ठ पर फुटनोट में:

"अब तक आपको लगता है कि यह पता लगाने में सक्षम होना चाहिए इस कोड को देखते हुए स्काला संकलक

आह्वान होगा (bills.!*&^%~(code)).!()."

मेरे लिए गुप्त को एक सा यही कारण है, किसी को समझा सकता है यहाँ क्या हो रहा है?

+0

किसी ने भी ", अभी तक – ziggystar

+1

@ziggystar को समझाया है, यह प्रश्न समापन उद्धरण गायब था। यह कोड का हिस्सा नहीं है। –

+1

मैं एक के लिए सोचता हूं कि श्री ओडरस्की को प्रतीकों की भ्रमित भीड़ से बचना चाहिए और बदनामी लिखना चाहिए एएससीआईआई में बाहर। कम से कम, मैं वही कर रहा हूं। –

उत्तर

9

क्या ओडर्सकी का कहना है कि यह वैध कोड होना संभव होगा। उदाहरण के लिए, नीचे दिए गए कोड:

class BadCode(whose: String, source: String) { 
    def ! = println(whose+", what the hell do you mean by '"+source+"'???") 
} 

class Programmer(who: String) { 
    def !*&^%~(source: String) = new BadCode(who, source) 
} 

val bills = new Programmer("Bill") 
val code = "def !*&^%~(source: String) = new BadCode(who, source)" 
bills !*&^%~ code! 

बस कॉपी & आरईपीएल पर पेस्ट कर दें।

+0

@ डैनियल इस अद्भुत उदाहरण के लिए आपको बहुत बहुत धन्यवाद। आपको स्कैला बाल्क बेल्ट बैज से सम्मानित किया जाना चाहिए। – stacker

+0

@stacker मुझे सोने का बैज मिला है, यह अब के लिए पर्याप्त होना चाहिए। :-) –

2

मैं अगर किताब विधि हस्ताक्षर प्रदान करता है यकीन नहीं है, लेकिन मुझे लगता है कि यह सिर्फ स्काला के वाक्यात्मक चीनी पर एक टिप्पणी है, इसलिए इसमें मान लिया गया है कि अगर आप लिखना:

bill add monkey 

जहां एक वस्तु बिल एक विधि जोड़ने है जो वहाँ है एक पैरामीटर तो लेता है तो वह अपने आप के रूप में यह व्याख्या जो:

bill.add(monkey) 

एक छोटे से स्काला जंग लगी होने के नाते, मैं पूरी तरह से यकीन है कि यह कैसे कोड विभाजन नहीं कर रहा हूँ! में (कोड)।!() ग्रे कोशिकाओं की एक अस्पष्ट गुदगुदी को छोड़कर! ऑपरेटर का उपयोग एक अभिनेता को आग लगाने के लिए किया जाता है, जिसमें कंपाइलर शब्दों को ऑब्जेक्ट पर एक अंतर्निहित।!() विधि के रूप में व्याख्या किया जा सकता है।

+0

वैकल्पिक व्याख्या करने के लिए +1 '()', इस शोर के बारे में क्या है! * * और ^% ~ 'क्या वे कोई समझ लेते हैं? – stacker

3

अवधि एक पैरामीटर लेने वाली विधि को कॉल करने के लिए वैकल्पिक है, या खाली पैरामीटर सूची है।

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

इसलिए,

(बिल।! * & ^% ~ (कोड))।!()।

बिल के समान है! * & ^% ~ कोड!

दूसरा विस्मयादिबोधक चिह्न पहली विधि कॉल से लौटाए गए मूल्य पर एक विधि को कॉल करता है।

+0

वैकल्पिक '।' के लिए +1 , इस शोर के बारे में क्या है! * * और ^% ~ 'क्या वे कोई समझ में आते हैं? – stacker

+0

स्टेकर: स्कैला में, आप (लगभग) जो भी पात्र पसंद करते हैं, उसका उपयोग कर विधियों के नाम दे सकते हैं। यह सिर्फ एक विधि है! * * और^% ~ ' – Jesper

2

विधि कॉल के साथ '।()' वैकल्पिक होने के संयोजन (जैसा कि ऊपर वर्णित Wysawyg) का संयोजन है और नामकरण विधियों के लिए आप जो भी पात्र पसंद करते हैं (लगभग) का उपयोग करने की क्षमता, स्केल में विधियों को लिखना संभव बनाता है जो दिखता है ऑपरेटर अधिभार की तरह। आप अपने स्वयं के ऑपरेटरों का आविष्कार भी कर सकते हैं।

उदाहरण के लिए, मेरे पास एक प्रोग्राम है जो 3 डी कंप्यूटर ग्राफिक्स से संबंधित है।

class Vector(val x: Double, val y: Double, val z: Double) { 
    def +(v: Vector) = new Vector(x + v.x, y + v.y, z + v.z) 

    // ...etc. 
} 

मैं भी एक विधि ** (ऊपर नहीं दिखाया गया है) द्वारा निर्धारित किए गए दो की cross product वैक्टर गणना करने के लिए: मैं एक 3D सदिश का प्रतिनिधित्व करने के लिए अपने ही वर्ग Vector है।यह बहुत सुविधाजनक है कि आप स्कैला में अपने स्वयं के ऑपरेटर बना सकते हैं, कई अन्य प्रोग्रामिंग भाषाओं में यह लचीलापन नहीं है।

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