सारांश
रूप { ... }
एक "ब्लॉक" (लोअरकेस) के लेट्स कॉल शाब्दिक कार्यक्रम पाठ।
जब एक ब्लॉक term स्थिति में है:
नियम 1 #। एक ब्लॉक होना चाहिए?signature वाला एक ब्लॉक कॉल करने योग्य कोड होना चाहिए। इसे statements उर्फ Block
की सूची के रूप में व्याख्या किया जाएगा।
नियम # 2। एक हैश की तरह दिखता है? अन्यथा, यदि कोई ब्लॉक उस मान के साथ शुरू होता है जो वाक्य रचनात्मक रूप से Associative
है, तो इसका अर्थ शाब्दिक Hash
कन्स्ट्रक्टर के रूप में किया जाएगा।
नियम # 3। अन्यथा, इसे Block
के रूप में व्याख्या किया जाएगा।
और अधिक विस्तार में
एक ब्लॉक एक हस्ताक्षर है, तो ब्लॉक एक ब्लॉक किया जाना चाहिए।
कुछ ब्लॉकों में स्पष्ट हस्ताक्षर है। ये एक Block
होना चाहिए:
say WHAT -> $foo { key => $foo, 'a', 'b' } # (Block)
कुछ ब्लॉकों एक निहित हस्ताक्षर किया है। प्लेसहोल्डर चर का उपयोग (उदा। $^foo
) तत्काल संलग्न ब्लॉक को एक अंतर्निहित हस्ताक्षर देता है (इसमें $foo
पैरामीटर के साथ)। किसी भी सर्वनाम का उपयोग ($_
, @_
, या %_
) तत्काल संलग्न ब्लॉक को एक अंतर्निहित हस्ताक्षर देता है यदि उसके पास पहले से कोई स्पष्ट नहीं है।
# Both these blocks have a signature, the first one implicitly so:
say WHAT { key => $_, 'a', 'b' } # These two lines mean
say WHAT -> $_ { key => $_, 'a', 'b' } # the same thing
अन्यथा, यदि ब्लॉक की सामग्री वाक्य रचना है कि Associative
एक मूल्य के साथ शुरू होता है, तो ब्लॉक एक Hash
के रूप में व्याख्या की जाएगी।
द्वारा "वाक्य रचना है कि Associative
एक मूल्य" मेरा मतलब है या तो एक साहचर्य शाब्दिक मूल्य (:foo
जैसे या foo => True
आदि) या एक %
sigil'd चर:
say WHAT { key => $foo, 'a', 'b' } # (Hash)
say WHAT { 'a', 'b', key => $foo } # (Block)
say WHAT { %foo, 'a', 'b' } # (Hash)
say WHAT { Pair.new('key',$foo), 'a', 'b' } # (Block)
Hash
से Block
या उपाध्यक्ष पर स्विच किया विपरीत
यदि आप एक Block
चाहता था, लेकिन एक Hash
मिला है, मुहावरेदार परिवर्तन ब्लॉक के शुरू में एक ;
जोड़ने, यानी {; ...}
है।
यदि आप Hash
चाहते थे लेकिन Block
मिला, तो या तो उपरोक्त नियमों का पालन करें या %()
प्रति @ सामंत एम के उत्तर का उपयोग करें।
फुटनोट
कई निर्माणों हमेशा जैसे class foo { ... }
कुछ स्थिति में एक शाब्दिक ब्लॉक की आवश्यकता है। इन ब्लॉकों को हमेशा Block
के रूप में व्याख्या किया जाता है। postcircumfix operator के रूप में दिखाई देने वाला एक ब्लॉक, जैसा कि %foo{...}
में देखा गया है, को Associative
अनुक्रमण ऑपरेशन के रूप में व्याख्या किया जाएगा।
मुझे याद है कि '{}' के साथ हैश बनाने में त्रुटि होती है और आपको '%()' का उपयोग करने के लिए कहा जाता है। मेरी राय में यह व्यवहार वापस आना चाहिए। – ab5tract
दस्तावेज को प्रतिबिंबित करने के लिए दस्तावेज़ को एक प्रमुख अद्यतन की आवश्यकता है। '{}' एक विकल्प के रूप में उल्लिखित है जब '{}' काम नहीं करता है। यदि यह दस्तावेज़ नहीं है तो चीजों को करने का पसंदीदा तरीका कहां है? –
मैं आपके मूल्यांकन ब्रायन से पूरी तरह से सहमत हूं। मैंने यहां एक दस्तावेज़ समस्या खोली है https://github.com/perl6/doc/issues/1380 हम बहिष्करण चेतावनियां करते थे जो प्रोग्राम पूरा होने के बाद दिखाए जाएंगे, शायद ऐसा कुछ है जिसे हम 6. डी के लिए जोड़ना चाहते हैं आप '{}' के साथ एक हैश बनाते हैं। –