2009-09-06 11 views
19

जब मैंने पहली बार स्कैला को देखना शुरू किया, तो मुझे समझ के लिए पसंद आया। वे फोरैच लूप की तरह थोड़ा सा लग रहा था, जिसका इस्तेमाल मुझे जावा 5 से किया गया था, लेकिन कार्यात्मक प्रतिबंधों और बहुत सारी मीठी वाक्य रचनात्मक अच्छीता के साथ।स्कैला के लिए समझदारी: महत्वपूर्ण विशेषता या वाक्य रचनात्मक चीनी?

लेकिन जैसा कि मैंने स्काला शैली अवशोषित करने के बाद, मुझे लगता है कि हर बार जब मैं एक के लिए-comprension मैं बजाय map, flatMap, filter, reduce और foreach उपयोग कर रहा हूँ इस्तेमाल कर सकते हैं लगता है। कोड की मंशा मुझे उस तरह से स्पष्ट लगती है, कम संभावित छुपे हुए आश्चर्यों के साथ, और वे आमतौर पर छोटे कोड भी होते हैं।

जहां तक ​​मुझे पता है, समझ के लिए हमेशा इन विधियों में संकलित किया जाता है, इसलिए मैं सोच रहा हूं: वे वास्तव में क्या हैं? क्या मुझे कुछ कार्यात्मक पुनरुत्थान याद आ रहा है (यह पहली बार नहीं होगा)? समझने के लिए कुछ अन्य चीजें कुछ नहीं कर सकती हैं, या कम से कम बहुत अधिक गड़बड़ होगी? क्या वे एक विशेष उपयोग के मामले में चमकते हैं? क्या यह वास्तव में सिर्फ व्यक्तिगत स्वाद का मामला है?

+2

यह http://stackoverflow.com/questions के लगभग डुप्लिकेट है/1052476/कर सकते हैं-कोई-समझाने-scalas उपज। उस सवाल से आश्चर्य हुआ कि 'उपज' क्या हुआ, यह आश्चर्य करता है कि इसका उद्देश्य क्या है। जवाब वही हैं। –

उत्तर

13

कृपया this question देखें। संक्षिप्त जवाब यह है कि समझ के लिए और अधिक पठनीय हो सकता है। विशेष रूप से, यदि आपके पास कई घोंसले जेनरेटर हैं, तो आप जो भी कर रहे हैं उसका वास्तविक दायरा अधिक स्पष्ट हो जाता है, और आपको भारी इंडेंट की आवश्यकता नहीं है।

10

समझ के लिए वाक्य रचनात्मक चीनी हैं, लेकिन इसका मतलब यह नहीं है कि वे महत्वपूर्ण नहीं हैं। वे आमतौर पर अपने विस्तारित रूप से अधिक संक्षिप्त होते हैं, जो कि अच्छा है, लेकिन शायद अधिक महत्वपूर्ण बात यह है कि वे अनिवार्य भाषाओं से प्रोग्रामर को कार्यात्मक संरचनाओं का उपयोग करने में मदद करते हैं।

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

3

आप सही हैं। समझ के लिए वाक्य रचनात्मक चीनी है। मेरा मानना ​​है कि अंतर्निहित विधियां अधिक संक्षिप्त और पढ़ने में आसान होती हैं, एक बार जब आप उनका उपयोग कर लेते हैं।

1. for (i <- 1 to 100; if (i % 3 == 0)) yield Math.pow(i, 2) 
2. (1 to 100).filter(_ % 3 == 0).map(Math.pow(_, 2)) 

मेरी राय में, # भावना से 1 ध्यान हट में अर्धविराम के अलावा कि यह एक एकल श्रृंखलित कथन है:

निम्नलिखित बराबर बयान की तुलना करें। एक भावना भी है कि मैं एक var (क्या यह 1 है, या यह 99 है, या कुछ के बीच में?) जो एक अन्यथा कार्यात्मक शैली से detracts।

विकल्प 2 स्पष्ट रूप से ऑब्जेक्ट्स पर विधि कॉल की एक श्रृंखला है। श्रृंखला में प्रत्येक लिंक स्पष्ट रूप से अपनी ज़िम्मेदारी बताता है। कोई मध्यवर्ती चर नहीं हैं।

शायद समझ के लिए जावा से डेवलपर्स डेवलपर्स की सुविधा के रूप में शामिल किया गया है। भले ही, जो चुना जाता है वह शैली और वरीयता का मामला है।

+0

"एक बार जब आप उनका उपयोग कर रहे हैं" - बिल्कुल। एक बार जब मैं monads समझ गया, मैं अंतर्निहित तरीकों पर स्विच किया। समझ के लिए इससे पहले एक उपयोगी लिंक था। –

+1

आपको 1 में कोई अर्धविराम की आवश्यकता नहीं है: '(i <- 1 से 100 अगर (i% 3 == 0)) Math.pow (i, 2) उपज। इसके अलावा, आप अर्धविराम अनुमान को सक्रिय करने के लिए ब्रैस के साथ ब्रांड्स को प्रतिस्थापित कर सकते हैं। – Blaisorblade

+0

धन्यवाद @ ब्लाइसोरब्लैड मुझे आश्चर्य है कि 200 9 में अर्धविराम की आवश्यकता थी। – Synesso

11

आंतरिक डीएसएल के लिए समझदारी का एक और बड़ा उपयोग है। ScalaQL इसका एक बड़ा उदाहरण है। यह इस

SELECT p.* FROM people p JOIN companies c ON p.company_id = c.id WHERE p.age < 14 

में इस

val underAge = for { 
    p <- Person 
    c <- Company 
    if p.company is c 
    if p.age < 14 
} yield p 

बदल सकते हैं और भी बहुत कुछ शामिल।

+0

@Erik यह मैंने कोशिश की जब यह काम किया। यह एक पीडीएफ फाइल का एक लिंक है। यदि आप अभी भी फ़ाइल डाउनलोड नहीं कर सकते हैं, तो बस इसे Google: स्कैक्लुएल: स्कैन के लिए भाषा-एकीकृत डेटाबेस क्वेरीज़ डैनियल स्पिवाक और टियां झो –

+0

डाउनवॉटेड द्वारा: वास्तविक प्रश्न यह है कि क्या उनके desugaring पर समझ के लिए कोई फायदा है - और आप उस कोड को desugared रूप में भी लिख सकते हैं। ScalaQuery एक बेहतर उदाहरण है, क्योंकि इसमें उपलब्ध उत्पादन-गुणवत्ता कार्यान्वयन है। यह पेपर सिफारिश करने के लिए बहुत से महत्वपूर्ण विवरणों पर झलकता है। – Blaisorblade

5

कुछ मामलों में, समझ के लिए इरादे बेहतर व्यक्त कर सकते हैं, इसलिए जब वे करते हैं, तो उनका उपयोग करें।

यह भी ध्यान रखें कि समझ के साथ, आपको पैटर्न से मिलान करने के लिए मिलता है। उदाहरण के लिए, एक मानचित्र से अधिक पुनरावृत्ति समझ के लिए के साथ बहुत सरल है:

foreach के साथ की तुलना में

for ((key, value) <- map) println (key + "-->" + value)

:

map foreach { case (key, value) => println (key + "-->" + value) }

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