2011-08-10 16 views
7

में क्रिएटिव और उपयोगी ऑपरेटर उपयोग के उदाहरण ऑपरेटर ओवरलोडिंग के बारे में किसी मित्र के साथ चर्चा के बाद। मैं स्कैला में ऑपरेटर ओवरलोडिंग के रचनात्मक और/या उपयोगी उदाहरण उपयोग को देख रहा हूं।स्केल

  • गणितीय निर्माणों, रेखीय बीजगणित या जटिल संख्या (+ * -)
  • खोल पाइप और पुनर्निर्देशन (| > < >>)
  • व्याकरण में (|)
वैकल्पिक भाव की नकल करना पसंद है: मैं कुछ शांत चित्र है

क्या आपके पास अन्य अच्छे उदाहरण हैं?

+0

बहुत अधिक रचनात्मकता आमतौर पर एक बुरी चीज होती है, क्योंकि यह अपेक्षाओं का उल्लंघन करती है। ऑपरेटर अधिभार सबसे शक्तिशाली होता है जब इसका उपयोग किया जाता है जैसे कि सभी उम्मीद करेंगे: हां, निश्चित रूप से '*' जटिल संख्याओं के साथ-साथ युगल भी बढ़ता है! उदाहरण के लिए, आपके रिटर्न वैरिएबल 'फ्रोडो' नामकरण और एक अस्थायी स्वैप वैरिएबल 'सैम' एक अर्थ में रचनात्मक है, लेकिन यह काफी समझ में नहीं आता है (विशेष रूप से लोगों को रिंग्स के भगवान से अपरिचित लोगों के लिए)। आपके रिटर्न वैरिएबल का नामकरण '<---' और आपके स्वैप वैरिएबल '<--> 'शायद अधिक बेहतर नहीं है। –

+1

स्कैला के लिए नए लोगों के लिए, ध्यान रखें कि स्कैला का "ऑपरेटर सिंटैक्स" सामान्य स्कैला विधियों को कॉल करने का एक अच्छा तरीका है। तो 'x + y'' x। + (Y) 'जैसा ही है। दोनों स्थितियों में, '+' ऑब्जेक्ट 'x' पर एक सामान्य विधि है, जो' Int', 'Double', आदि प्रकार का हो सकता है। ऑपरेटर सिंटैक्स को प्रतीकात्मक नामित विधि की आवश्यकता नहीं है (उदाहरण के लिए, 'list1 ज़िप सूची 2 'काम करता है), लेकिन प्रतीकात्मक रूप से नामित विधि का उपयोग करके स्कैला को अंतर्निहित प्राथमिकता नियम लागू करने की अनुमति मिलती है। –

+0

क्षमा करें, लेकिन SO अभी भी "आपके सभी पसंदीदा एक्स के लिए वाई" प्रश्नों को स्वीकार नहीं कर रहा है। जब तक आपकी वर्तमान समस्या नहीं है * मुझे सभी ऑपरेटरों को सूचीबद्ध करने की आवश्यकता है * या कुछ ऐसे, यह [faq] के अनुसार दायरे से बाहर है। –

उत्तर

7
लोगों मैं कभी कभी का उपयोग कर कोई आपत्ति नहीं है

: एक सामान्य प्रयोजन पाइप |> (जैसे, someValue |> println)

  • := एक नमूदार मूल्य धारकों की तरह कुछ संरचनाओं काम की नकल करने के
  • Databinding में

    • यूआई प्रोग्रामिंग <=> (दो-तरफा), <== (एक तरफा) (उदाहरण के लिए, field.enabled <=> options.isEditable
  • 2

    यह स्कैला समुदाय में थोड़ा विवादास्पद विषय है। एक तरफ लोगों को दुर्व्यवहार का डर लगता है कि वे अचूक कार्यक्रमों का कारण बन सकते हैं। यदि आपको गंभीरता से लगता है कि यह पहले से मौजूद है। क्योंकि ऑपरेटर 'स्वाभाविक रूप से' महसूस करते हैं? तो चलिए गणितीय ऑपरेटरों को लेते हैं: + - */ तो स्ट्रिंग्स पर 'अधिकांश' प्रोग्रामिंग भाषाओं में क्यों परिभाषित किया गया है?

    दूसरी तरफ 'अच्छी तरह से ज्ञात ऑपरेटर अधिक संक्षिप्त और समझदार कोड का कारण बन सकते हैं। स्कैला यूनिकोड प्रतीकों का समर्थन करता है ताकि आप प्रतीकों का उपयोग कर सकें जैसे/u + 2211। उदाहरण: सूची (1,2,3) .sum // हमें यूनिकोड कीबोर्ड समर्थन की कमी के कारण/u + 2211 के बजाय योग का उपयोग करके 6 प्रदान करेगा।

    तो 3 वर्णों (एस, यू, एम) के बजाय हमारे पास एक (/ u + 2211) क्या यह अच्छा या बुरा है? मेरी राय में स्कैला समुदाय को इस विषय पर एक सामान्य ज्ञान मिलेगा लेकिन इसमें कुछ समय लगेगा।

    अन्य प्रोग्रामिंग भाषाएं जो यूनिकोड अभिव्यक्तियों का समर्थन करती हैं उनमें किले शामिल हैं।

    4

    मुझे स्कैला में उपयोगी दो "अंतर्निर्मित" ऑपरेटर मिलते हैं: :: और ->

    मानचित्र निर्माण में, आप Map("a" -> 1) लिख सकते हैं और स्कैला "a" -> 1("a", 1) tuple में अनुवाद कर सकते हैं। :: का उपयोग सूची के सामने जोड़ने के लिए किया जाता है, यह भी बहुत सुविधाजनक है।

    += और -= संग्रह के लिए ऑपरेटर बहुत अच्छे हैं, खासकर क्योंकि वे उत्परिवर्तनीय और अपरिवर्तनीय लोगों पर भी लागू होते हैं।

    2

    कुछ समय पहले I showedJCR पेड़ के नोड्स और गुणों में हेरफेर करने के लिए ऑपरेटरों के साथ एक डीएसएल कैसे बनाया जाए। यदि सही ढंग से कोड सही कोड पेड़ की ASCII कला चित्र जैसा दिखता है।स्काला कोड निम्नलिखित

    root ¦- "movies" -+ { n: Node => 
           n ¦= ("title", "Night on Earth") 
           n ¦= ("length", 123L) 
           n ¦= ("ratings", 9L::8L::5L::Nil) 
           n ¦= ("languages", "en"::"it"::"fi"::"fr"::Nil) 
           n ¦- "cast" -+ { n: Node => 
              n ¦= ("Gena Rowlands", "Victoria Snelling") 
              n ¦= ("Winona Ryder", "Corky") 
              n ¦= ("Roberto Benigni", "Taxi Driver") }} 
    

    जावा में इस संस्करण के बराबर है:

    Node movies = root.addNode("movies"); 
        movies.setProperty("title", "Night on Earth"); 
        movies.setProperty("length", 123L); 
        movies.setProperty("ratings", new String[]{"9", "8", "5"}, PropertyType.LONG); 
        movies.setProperty("languages", new String[]{"en", "it", "fi", "fr"}, PropertyType.STRING); 
        Node cast = movies.addNode("cast"); 
        cast.setProperty("Gena Rowlands", "Victoria Snelling"); 
        cast.setProperty("Winona Ryder", "Corky"); 
        cast.setProperty("Roberto Benigni", "Taxi Driver"); 
    

    जबकि जरूरी उपयोगी नहीं है, यह रचनात्मकता के लिए एक बिंदु के लायक हो सकता है।

    +1

    यदि आपने जावा संस्करण को स्केल संस्करण की तरह इंडेंट किया है, तो यह इतना बुरा नहीं लगेगा ... –