2010-05-27 15 views
39

में ऑपरेटर प्राथमिकता मुझे स्काला के ऑपरेटर प्राथमिकता का प्रस्ताव पसंद है लेकिन कुछ दुर्लभ मामलों में, असम्बद्ध नियम असुविधाजनक हो सकते हैं, क्योंकि आपके पास अपने तरीकों का नामकरण करने में प्रतिबंध हैं। क्या स्काला में कक्षा/फ़ाइल इत्यादि के लिए अन्य नियमों को परिभाषित करने के तरीके हैं? यदि नहीं, तो क्या भविष्य में इसे हल किया जाएगा?स्कैला

+3

संबंधित मेलिंग सूची धागा: http://scala-programming-language.1934581.n4.nabble.com/More-unicode-alternatives-for-ASCII-operators-td2008146.html – retronym

उत्तर

91

ऑपरेटर प्राथमिकता ऑपरेटर में पहले वर्ण द्वारा Scala Reference - 6.12.3 Infix Operations में तय की गई है। प्राथमिकता के क्रम में वृद्धि में सूचीबद्ध:

(all letters) 
| 
^ 
& 
= ! 
< > 
: 
+ - 
*/% 
(all other special characters) 

और यह बहुत संभव नहीं है कि यह बदलेगा। यह शायद इसे ठीक करने से अधिक समस्याएं पैदा करेगा। यदि आप सामान्य ऑपरेटर प्राथमिकता का उपयोग कर रहे हैं तो इसे एक वर्ग के लिए बदलना काफी उलझन में होगा।

+5

उद्धृत संदर्भ से @huynhjl: " इस नियम के लिए एक अपवाद है, जो असाइनमेंट ऑपरेटर (§6.12.4) से संबंधित है। एक असाइनमेंट ऑपरेटर की प्राथमिकता सरल असाइनमेंट (=) के समान है। यानी, यह किसी अन्य ऑपरेटर की प्राथमिकता से कम है । " §6.12.4 एक असाइनमेंट ऑपरेटर का वर्णन करता है जो "=" में समाप्त होता है। तो उपरोक्त सूची गलत की बजाय अपूर्ण है। –

+6

@ लुइगी प्लिंग, '===' असाइनमेंट ऑपरेटर नहीं है क्योंकि अपवाद में: '=' में समाप्त होने वाला ऑपरेटर एक असाइनमेंट ऑपरेटर है * जब तक ऑपरेटर बराबर वर्ण * के साथ भी शुरू नहीं होता है। गमन थ्रेड और अन्य लिंक को देखें, मार्टिन ने स्वयं संकेत दिया कि एसएलएस को एक अपडेट की आवश्यकता है। मैं अभी तक एक अद्यतन नहीं देख सकता। – huynhjl

+1

मुझे लगता है कि '(सभी अक्षरों) 'को" कमजोर "बनाने का निर्णय अजीब है:' एक बी है || सी में डी 'है, जो मुझे लगता है कि लगातार निर्माण होता है, कोष्ठक की आवश्यकता होती है ... –

7

ऐसी कोई क्षमता नहीं है और इसे अचूक भविष्य में जोड़ने की संभावना कम है।

0

असंशोधित नियम असुविधाजनक हो सकता है, क्योंकि आप अपने तरीकों

  • नामकरण आप अपने तरीकों के नामकरण में कोई प्रतिबंध नहीं है में प्रतिबंध है। उदाहरण के लिए, आप कक्षा के लिए विधियों +, -, * आदि को परिभाषित कर सकते हैं।
  • हमें थॉमस जंग द्वारा पिछले उत्तर (https://stackoverflow.com/a/2922456) में उल्लिखित "अनमोडिफाइड नियम" (स्कैला ऑपरेटर प्राथमिकता नियमों द्वारा लागू) का भी पालन करना होगा - यह सभी प्रोग्रामिंग भाषाओं और सार बीजगणित नहीं होने पर कई लोगों के लिए आम है; हमें एक + बी * सी के लिए ऑपरेटर प्राथमिकता को फिर से परिभाषित करने की आवश्यकता नहीं है।

"तर्कसंगत" वर्ग उदाहरण के लिए http://www.scala-lang.org/docu/files/ScalaByExample.pdf पुस्तक के अध्याय 6 देखें।

+0

"आपके तरीकों का नामकरण करने में प्रतिबंध" से मेरा मतलब है कि यदि, उदाहरण के लिए, आपको लगता है कि '+' आपकी विधि के लिए एक आदर्श नाम है, तो ऐसी स्थितियां हो सकती हैं जिन्हें आपको बिना किसी प्राथमिकता के कारण एक और नाम चुनने के लिए मजबूर किया जा सके। – Jeriho

+1

सभी प्रोग्रामिंग भाषाओं में अपरिवर्तनीय ऑपरेटर प्राथमिकता नहीं है। हैकेल के इन्फिक्स/इन्फिक्सर/इंफिक्सल कमांड को देखें। – Jeriho

1

typelevel fork of the scala compiler में उठाया गया था, जो संकलक का एक संस्करण 'पूर्वावलोकन' प्रयोगात्मक विशेषताएं था। डेवलपर्स ने सुझाव दिया कि यदि किसी के लिए SIP लिखना था, तो इसे कार्यान्वयन के लिए माना जा सकता है।

लेकिन वर्तमान स्थिति में, प्राथमिकता को ओवरराइड करने का कोई तरीका नहीं है। नियमों को औपचारिक रूप से language specification में परिभाषित किया गया है।