2017-05-21 36 views
7

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

आप ब्रेसिज़ के साथ एक Hash और वसा तीर का निर्माण कर सकते हैं:

my $color-name-to-rgb = { 
    'red' => 'FF0000', 
    }; 

put $color-name-to-rgb.^name; # Hash 

अन्य जोड़ी संकेतन का उपयोग करते हुए एक Hash भी पैदा करता है।

my $color-name-to-rgb = { 
    :red('FF0000'), 
    }; 

लेकिन, अनुपस्थित वसा तीर, मैं एक Block बजाय:

my $color-name-to-rgb = { 
    'red', 'FF0000', 
    }; 

put $color-name-to-rgb.^name; # Block 

Hash डॉक्स केवल कि ब्रेसिज़ के अंदर $_ का उपयोग कर बनाता है एक Block का उल्लेख है।

हैश को परिभाषित करने के अन्य तरीके हैं, लेकिन मैं इस विशेष वाक्यविन्यास के बारे में पूछ रहा हूं और उन कामकाजों की तलाश नहीं कर रहा हूं जिन्हें मैं पहले से जानता हूं।

$ perl6 -v 
This is Rakudo version 2017.04.3 built on MoarVM version 2017.04-53-g66c6dda 
implementing Perl 6.c. 

उत्तर

8

सारांश

रूप { ... } एक "ब्लॉक" (लोअरकेस) के लेट्स कॉल शाब्दिक कार्यक्रम पाठ।

जब एक ब्लॉक 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 अनुक्रमण ऑपरेशन के रूप में व्याख्या किया जाएगा।

7

पसंदीदा पर्ल 6 तरीका हैश बनाने के लिए %() का उपयोग करना है।

my $color-name-to-rgb = %(
    'red', 'FF0000', 
    ); 

मैं लोगों को कभी भी हैश बनाने के लिए ब्रेसिज़ का उपयोग करने की सलाह नहीं दूंगा। यदि वे हैश बनाना चाहते हैं तो %() ऐसा करने का सही तरीका है।

यदि आप पर्ल 5 दुनिया से आ रहे हैं तो हैश बनाने के दौरान के बजाय %() का उपयोग करने की आदत में सबसे अच्छा होना सर्वोत्तम है।

+2

मुझे याद है कि '{}' के साथ हैश बनाने में त्रुटि होती है और आपको '%()' का उपयोग करने के लिए कहा जाता है। मेरी राय में यह व्यवहार वापस आना चाहिए। – ab5tract

+4

दस्तावेज को प्रतिबिंबित करने के लिए दस्तावेज़ को एक प्रमुख अद्यतन की आवश्यकता है। '{}' एक विकल्प के रूप में उल्लिखित है जब '{}' काम नहीं करता है। यदि यह दस्तावेज़ नहीं है तो चीजों को करने का पसंदीदा तरीका कहां है? –

+0

मैं आपके मूल्यांकन ब्रायन से पूरी तरह से सहमत हूं। मैंने यहां एक दस्तावेज़ समस्या खोली है https://github.com/perl6/doc/issues/1380 हम बहिष्करण चेतावनियां करते थे जो प्रोग्राम पूरा होने के बाद दिखाए जाएंगे, शायद ऐसा कुछ है जिसे हम 6. डी के लिए जोड़ना चाहते हैं आप '{}' के साथ एक हैश बनाते हैं। –

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