डार्ट की अशक्त सुरक्षा में सूची () निर्माणकर्ता क्यों नहीं पहुंच पा रहा है?

Aug 17 2020

NNBD के साथ, आपको डिफ़ॉल्ट कंस्ट्रक्टर का उपयोग करके सूची को इनिशियलाइज़ करने की अनुमति नहीं है:

List<int> foo = List(); // Compile time error

हालाँकि, आप अभी भी कर सकते हैं:

List<int> foo = []; // No error

तो, दोनों में क्या अंतर है? या तो दोनों को त्रुटि दिखानी चाहिए या दोनों में से कोई भी।

जवाब

5 lrn Aug 18 2020 at 03:30

Listनिर्माता दो का उपयोग करता है के लिए किया था:

  • new List()के बराबर एक खाली बढ़ने योग्य सूची बनाने के लिए []
  • new List(n)मानों nसे भरी लंबाई की एक निश्चित लंबाई सूची बनाने के लिएnull

अशक्त सुरक्षा के साथ, दूसरा उपयोग अधिकांश समय निराधार था, और इसे ठीक करने का कोई अच्छा तरीका नहीं था। यह गैर-व्यर्थ होने के लिए एक प्रकार का तर्क मजबूर करने के लिए संभव है, लेकिन List<T>(4)केवल काम करता है जब Tहै नल । इसे लागू करने का कोई तरीका नहीं है।

तो, List(n)जाने के लिए आवश्यक मोड ( List.filled(n, value)जिसके द्वारा आपको भरण-मूल्य प्रदान करने के लिए बाध्य किया जाता है)। वह छोड़ दिया List(), जो वास्तव में अपना वजन नहीं ले जाता है। आप []इसके बजाय (और आपको चाहिए !) का उपयोग कर सकते हैं , इसलिए निर्माणकर्ता को पूरी तरह से हटाने का फैसला किया गया था - इसके सभी उपयोग या तो असुरक्षित या बेकार थे। (इसके अलावा, यह पहले से ही एक अजीब रचनाकार था, क्योंकि अगर हम इसे अच्छी तरह से सुरक्षित बनाना चाहते थे, तो यह एक गैर-अशक्त प्रकार और कोई डिफ़ॉल्ट मान वाला वैकल्पिक पैरामीटर नहीं होगा।)

इसे पूरी तरह से हटाकर, यह संभव बनाता है, संभवतः, Listभविष्य में एक नया निर्माणकर्ता पेश करता है, शायद इसके लिए एक छोटा उर्फ ​​के रूप में List.filled। कोई उम्मीद कर सकता है।