में इन्फिक्स विधि कॉल और विपक्ष ऑपरेटर (: :) को समझना स्कैला प्रोग्रामिंग भाषा के लिए काफी नया है, और मैं अपने दिमाग में फंस गया कुछ कोशिश कर रहा था, जबकि मैं here पर व्याख्यान नोट्स का पालन कर रहा था। ,स्केल
मैं एक छद्म यादृच्छिक संख्या जनरेटर बना लिया है तो एक यादृच्छिक मूल्य की एक सूची बनाने की कोशिश की:
मुझे लगता है कि मैं वास्तव में नहीं समझ सकता है कैसे विपक्ष ऑपरेटर काम करता है, यहाँ कुछ चीजें मैंने कोशिश कर रहे हैं:
scala> val gen = new java.util.Random
gen: java.util.Random = [email protected]
scala> gen nextInt 3 :: Nil
<console>:7: error: type mismatch;
found : List[Int]
required: Int
gen nextInt 3 :: Nil
^
लेकिन यह सूची (3) को अगली विधि में पास करने का प्रयास किया। जब मैं paratheses इस्तेमाल किया, वहाँ कोई समस्या नहीं
scala> (gen nextInt 3) :: Nil
res69: List[Int] = List(1)
मैं निष्पादन आदेश के बारे में उत्सुक था, तो मैं यह
scala> def pr(i:Int):Int = { println(i); i }
pr: (i: Int)Int
scala> pr(1) :: pr(2) :: pr(3) :: Nil
1
2
3
res71: List[Int] = List(1, 2, 3)
जाँच करने के लिए के रूप में आउटपुट में देखा एक समारोह बनाया है, निष्पादन के आदेश के रूप में एक ही है उपस्थिति का क्रम। फिर मैंने सोचा कि यह 'nextInt' समारोह के बारे में हो सकता है, तो मैं निम्नलिखित की कोशिश की:
scala> 1 + 2 :: Nil
res72: List[Int] = List(3)
यह पहली बार इसके मार डाला, और कहा कि विपक्ष के बाद मार डाला जाता है। तो यहां सवाल है: gen nextInt 3 :: Nil
और 1 + 2 :: Nil
के बीच क्या अंतर है?
आपके विस्तृत उत्तर के लिए धन्यवाद, इसने मुझे कई अन्य चीजों के बारे में भी कई संकेत दिए। लेकिन मेरे पास एक और सवाल है: संकलक मेरे शुरुआती प्रश्न में दिए गए तीसरे कोड खंड में अभिव्यक्ति की व्याख्या कैसे करता है; संश्लेषण के मामले में? क्योंकि फ़ंक्शन पीआर का उपयोग करके पता चला है कि नियम बाएं से दाएं क्रम में निष्पादित किए जाते हैं। – ciuncan
यह सही है, फ़ंक्शन कॉल का मूल्यांकन बाएं से दाएं से किया जाता है। ऐसा इसलिए है क्योंकि 'pr (X)' '::' के तर्क अभिव्यक्ति हैं और इन्हें पहले उपस्थिति के क्रम में मूल्यांकन किया जाता है और फिर मान विधि को पास किया जाता है। 'पीआर (1) :: पीआर (2) :: पीआर (3) :: नील 'प्रिंट 1 2 3. लेकिन' शून्य ::(pr(3)).::(pr(2))। : :(पीआर (1)) 'प्रिंट 3 2 1. लेकिन दोनों लौट रहे हैं 'सूची (1, 2, 3)' –
@ciuncan मुझे नहीं पता। यह हो सकता है कि सही फिक्सिटी के साथ ऑपरेटर नोटेशन एक मूल्यांकन आदेश को डॉट नोटेशन के साथ संभव नहीं बनाता है, या हो सकता है कि संकलक '::' कॉल को अनुकूलित करता है लेकिन मूल्यांकन आदेश से संबंधित एक बग है। –