डिफ़ॉल्ट Raku क्यों / जबकि / पाश / जब ब्लॉक सभी एक ही पहचान मूल्य (.WHICH) है?


9

उस ब्लॉक को छोड़कर, जहां मैंने एक हस्ताक्षर की घोषणा की है, सभी ब्लॉकों का समान पहचान मूल्य है, और यह दावा किया जाता है कि लाइन 1 पर घोषित होने की परवाह किए बिना जहां भी हो। क्या कोई इस तरह से प्रकाश डाल सकता है कि ऐसा क्यों है?

say 「Let's look at some blocks…」;

if True {
  &?BLOCK.say;
}

while True {
  &?BLOCK.say;
  last;
}

loop {
  &?BLOCK.say;
  last;
}

if True -> | {
  「I'm different!」.say;
  &?BLOCK.say;
}

when ?True {
  &?BLOCK.say;
}

जवाबों:


6

सबसे पहले: .sayकरता है नहीं , आप पहचान की मूल्य दे क्योंकि वह कहता .gistदी अभिव्यक्ति पर विधि। पहचान मूल्य के लिए, आपको .WHICHविधि को कॉल करने की आवश्यकता है । सौभाग्य से, Block.gistविधि करता है इसकी stringification में पहचान मूल्य शामिल हैं। लेकिन यह सभी वस्तुओं के मामले में होने की गारंटी नहीं है

आप वहां जो देख रहे हैं, वह काम पर स्टेटिक ऑप्टिमाइज़र है: क्योंकि ब्लॉक के अंदर कुछ भी नहीं हो रहा है, इसे खारिज किया जा सकता है। एक मामले में जहां यह अलग है (जहां एक वैकल्पिक हस्ताक्षर निर्दिष्ट) में, यह है अलग। आप के साथ इस स्क्रिप्ट को चलाने, तो --optimize=0या --optimize=1तो सभी ब्लॉक होगा अलग पहचान मान हैं।

मुझे लगता है कि आप इसे एक ऐसा मुद्दा कह सकते हैं जो उल्लेख &?BLOCKकरता है कि स्कोटलैस को स्थिर करने से स्टैटिक ऑप्टिमाइज़र को बाधित नहीं किया जाता है। दूसरी ओर, आप इसे DIHWIDT (डॉक्टर, इट हर्ट्स व्हेन आई डू डू) का मामला भी कह सकते हैं। तो ऐसा मत करो :-)

अद्यतन: यह अलग हस्ताक्षर है कि अंतर बना दिया है। डैनियल मीता ++


2
जानकारी के लिए धन्यवाद, हालांकि मुझे यकीन नहीं है कि मैं दूसरे पैराग्राफ के लिए अनुसरण कर रहा हूं। स्ट्रिंग के निर्माण से कोई फर्क नहीं पड़ता है, यह उस ब्लॉक के लिए हस्ताक्षर है जो करता है (इसका एक ही पहचान मूल्य है यदि मैं हस्ताक्षर हटाता हूं लेकिन स्ट्रिंग रखता हूं)।
डैनियल मीता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.