पता चलता है कि जब एक कास्ट ऑब्जेक्ट किसी फ़ंक्शन को पास किया जाता है जो इसे म्यूट करता है, डार्ट में
इस उदाहरण को लें:
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 ++ में, कंपाइलर गलतियाँ करते हैं जब हम ऐसा कुछ करने की कोशिश करते हैं। क्या डार्ट में इस त्रुटि का सामना करने से बचने के लिए हम कुछ भी कर सकते हैं?
जवाब
नहीं, डार्ट 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
)।