पता चलता है कि जब एक कास्ट ऑब्जेक्ट किसी फ़ंक्शन को पास किया जाता है जो इसे म्यूट करता है, डार्ट में

Aug 17 2020

इस उदाहरण को लें:

void modl(List<int> l) {
  l.add(90);
  print(l);
}

class Foo {
  final List<int> bar;
  const Foo(this.bar);

  @override
  String toString() => 'Foo{bar: $bar}';
}

void main() {
  var foo = const Foo([1,2,3,4]);
  modl(foo.bar);
  print (foo);
}

उपर्युक्त कोड चलाने से रनटाइम होता है Uncaught Error , लेकिन इससे हटा दिया constजाता है

var foo = const Foo([1,2,3,4]);

यह काम करने की अनुमति देता है।


यह मेरे लिए एक बग की तरह लगता है क्योंकि कॉन्स्टेबल वेरिएबल को म्यूट किया जा सकता है और डार्ट इसे रनटाइम पर डिटेक्ट करता है, जिसका अर्थ है कि किसी कॉस्ट ऑब्जेक्ट को संशोधित किए जाने पर इसका पता लगाने का साधन है, लेकिन इसे कंपाइल टाइम पर पता नहीं चलना चाहिए, जैसा कि देख रहा है कॉन्स्ट चर को " संकलन-समय स्थिरांक " कहा जाता है ।

यदि यह बग नहीं है, तो क्या डार्ट में कुछ भी है जो हमें संकलन समय पर पता लगाने की अनुमति देता है जब एक constचर संभवतः एक ऑपरेशन द्वारा उत्परिवर्तित होगा?

C ++ में, कंपाइलर गलतियाँ करते हैं जब हम ऐसा कुछ करने की कोशिश करते हैं। क्या डार्ट में इस त्रुटि का सामना करने से बचने के लिए हम कुछ भी कर सकते हैं?

जवाब

3 lrn Aug 17 2020 at 04:53

नहीं, डार्ट constऑब्जेक्ट निर्माण के आसपास एक संकलन-समय की विशेषता है, लेकिन यह प्रकार प्रणाली में परिलक्षित नहीं होता है। आप किसी भी वस्तु के प्रकार से यह नहीं बता सकते हैं कि यह स्थिर है या नहीं।

आमतौर पर यह कोई समस्या नहीं है क्योंकि एक वर्ग का एक उदाहरण जो कांस्टेबल हो सकता है, वह अपरिहार्य है। यह गहराई से अपरिवर्तनीय होने की गारंटी नहीं है, लेकिन उदाहरण में ही इसके क्षेत्र नहीं बदले जा सकते।

सूचियाँ, सेट और मानचित्र दोनों स्थिर और परिवर्तनशील हो सकते हैं। वही आप यहां देख रहे हैं। सूची तर्क const Foo(const [1, 2, 3, 4])स्थिर है, भले ही आप constसूची शाब्दिक पर अनावश्यक हटा दें । आपके पास एक ही मुद्दा new Foo(const [1, 2, 3, 4])होगा, जो एक अपरिवर्तनीय भी प्रदान करेगा foo.bar, लेकिन जो अन्यथा अप्रभेद्य होगा new Foo([1, 2, 3, 4])। एकमात्र वास्तविक अंतर यह है कि सूची संशोधित करने योग्य है या नहीं, और इसका पता लगाने का एकमात्र तरीका इसे संशोधित करने का प्रयास करना है।

सूचियाँ, सेट और मानचित्र यह पता लगाने का कोई तरीका प्रदान नहीं करते हैं कि क्या वे उत्परिवर्ती हैं या नहीं, सिवाय प्रयास के और त्रुटि को पकड़ने के।

C ++ से तुलना करते समय, डार्ट की धारणा constवस्तु का गुण है या, वास्तव में, जिस तरह से वस्तु का निर्माण होता है। वस्तु के लिए इसके कुछ परिणाम हो सकते हैं। एक const Foo(..)बस एक सामान्य Fooवस्तु बनाता है , लेकिन यह केवल गहरी अपरिवर्तनीय वस्तुओं का निर्माण कर सकता है, और वे विहित हैं। एक const [...]या const {...}से सूची / मानचित्र / सेट एक अलग तरह बनाता है गैर स्थिरांक शाब्दिक है, लेकिन है कि प्रकार में दृश्यमान नहीं है।

C ++ में, constऑब्जेक्ट ऑब्जेक्ट संदर्भ की एक संपत्ति है, और यह प्रतिबंधित करता है कि उस संदर्भ का उपयोग कैसे किया जा सकता है, लेकिन ऐसी कोई निरंतर ऑब्जेक्ट नहीं हैं। किसी भी वस्तु को constसंदर्भ के रूप में पारित किया जा सकता है ।

दो अवधारणाएं प्रकृति में पूरी तरह से अलग हैं, और बस एक ही नाम का उपयोग करने के लिए होता है (और दोनों जावास्क्रिप्ट से भी अलग हैं const)।