डार्ट की अशक्त सुरक्षा में सूची () निर्माणकर्ता क्यों नहीं पहुंच पा रहा है?
NNBD के साथ, आपको डिफ़ॉल्ट कंस्ट्रक्टर का उपयोग करके सूची को इनिशियलाइज़ करने की अनुमति नहीं है:
List<int> foo = List(); // Compile time error
हालाँकि, आप अभी भी कर सकते हैं:
List<int> foo = []; // No error
तो, दोनों में क्या अंतर है? या तो दोनों को त्रुटि दिखानी चाहिए या दोनों में से कोई भी।
जवाब
List
निर्माता दो का उपयोग करता है के लिए किया था:
new List()
के बराबर एक खाली बढ़ने योग्य सूची बनाने के लिए[]
।new List(n)
मानोंn
से भरी लंबाई की एक निश्चित लंबाई सूची बनाने के लिएnull
अशक्त सुरक्षा के साथ, दूसरा उपयोग अधिकांश समय निराधार था, और इसे ठीक करने का कोई अच्छा तरीका नहीं था। यह गैर-व्यर्थ होने के लिए एक प्रकार का तर्क मजबूर करने के लिए संभव है, लेकिन List<T>(4)
केवल काम करता है जब T
है नल । इसे लागू करने का कोई तरीका नहीं है।
तो, List(n)
जाने के लिए आवश्यक मोड ( List.filled(n, value)
जिसके द्वारा आपको भरण-मूल्य प्रदान करने के लिए बाध्य किया जाता है)। वह छोड़ दिया List()
, जो वास्तव में अपना वजन नहीं ले जाता है। आप []
इसके बजाय (और आपको चाहिए !) का उपयोग कर सकते हैं , इसलिए निर्माणकर्ता को पूरी तरह से हटाने का फैसला किया गया था - इसके सभी उपयोग या तो असुरक्षित या बेकार थे। (इसके अलावा, यह पहले से ही एक अजीब रचनाकार था, क्योंकि अगर हम इसे अच्छी तरह से सुरक्षित बनाना चाहते थे, तो यह एक गैर-अशक्त प्रकार और कोई डिफ़ॉल्ट मान वाला वैकल्पिक पैरामीटर नहीं होगा।)
इसे पूरी तरह से हटाकर, यह संभव बनाता है, संभवतः, List
भविष्य में एक नया निर्माणकर्ता पेश करता है, शायद इसके लिए एक छोटा उर्फ के रूप में List.filled
। कोई उम्मीद कर सकता है।