डार्ट में अशक्तता क्या है (डिफ़ॉल्ट रूप से अशक्त)?


27

मैंने नए डार्ट नल सुरक्षा भाषा फीचर के बारे में सुना है, वर्तमान में " गैर- अशक्त 'प्रयोग "। यह डिफ़ॉल्ट रूप से गैर-अशक्त शुरू करने वाला है ।

फ़ीचर स्पेसिफिकेशन को यहां और भाषा GitHub के इश्यू में देखा जा सकता है

यह कैसे काम करता है और मैं इसे कहाँ आज़मा सकता हूँ?

जवाबों:


49

गैर-अशक्त (डिफ़ॉल्ट रूप से)

गैर-अशक्त (डिफ़ॉल्ट रूप से) प्रयोग वर्तमान में nullsafety.dartpad.dev पर पाया जा सकता है ।
ध्यान रखें कि आप यहां पूरी युक्ति और पूर्ण रोडमैप पढ़ सकते हैं ।


डिफ़ॉल्ट रूप से गैर-अशक्त क्या है?

void main() {
  String word;
  print(word); // illegal

  word = 'Hello, ';
  print(word); // legal
}

जैसा कि आप ऊपर देख सकते हैं, एक चर डिफ़ॉल्ट रूप से गैर-अशक्त होने का मतलब है कि सामान्य रूप से घोषित किया गया प्रत्येक चर नहीं हो सकता है null। नतीजतन, चर को असाइन करने से पहले किसी भी ऑपरेशन को सौंपा गया है वह अवैध है।
इसके अतिरिक्त, nullगैर-अशक्त चर को असाइन करने की भी अनुमति नहीं है:

void main() {
  String word;

  word = null; // forbidden
  world = 'World!'; // allowed
}

यह मुझे कैसे मदद करता है?

यदि एक चर गैर-अशक्त है , तो आप सुनिश्चित कर सकते हैं कि यह कभी नहीं है null। जिसकी वजह से, आपको इसे पहले से जांचने की आवश्यकता नहीं है।

int number = 4;

void main() {
  if (number == null) return; // redundant

  int sum = number + 2; // allowed because number is also non-nullable
}

याद है

यदि वे अशक्त नहीं हैं, तो कक्षाओं में उदाहरण क्षेत्रों को आरंभीकृत किया जाना चाहिए :

class Foo {
  String word; // forbidden

  String sentence = 'Hello, World!'; // allowed
}

lateइस व्यवहार को संशोधित करने के लिए नीचे देखें ।

अशक्त प्रकार ( ?)

आप चर प्रकार पर प्रश्न चिह्न लगाकर अशक्त प्रकारों का उपयोग कर सकते हैं ?:

class Foo {
  String word; // forbidden

  String? sentence; // allowed
}

एक अशक्त चर का उपयोग करने से पहले इसे आरंभ करने की आवश्यकता नहीं है। यह nullडिफ़ॉल्ट रूप से आरंभिक है :

void main() {
  String? word;

  print(word); // prints null
}

!

!किसी भी वेरिएबल पर अप्लाई करने पर eएक रनटाइम एरर आएगा, अगर eयह शून्य है और अन्यथा इसे नॉन-न्युलेबल वैल्यू में बदल दिया जाए v

void main() {
  int? e = 5;
  int v = e!; // v is non-nullable; would throw an error if e were null

  String? word;
  print(word!); // throws runtime error if word is null

  print(null!); // throws runtime error
}

late

कीवर्ड का lateउपयोग उन चर को चिह्नित करने के लिए किया जा सकता है जिन्हें बाद में आरम्भ किया जाएगा , अर्थात जब वे घोषित नहीं किए जाते हैं लेकिन जब वे एक्सेस किए जाते हैं। इसका अर्थ यह भी है कि हमारे पास गैर-अशांत उदाहरण क्षेत्र हो सकते हैं, जिन्हें बाद में आरम्भ किया गया है:

class ExampleState extends State {
  late String word; // non-nullable

  @override
  void initState() {
    super.initState();

    // print(word) here would throw a runtime error
    word = 'Hello';
  }
}

wordआरंभ करने से पहले एक्सेस करना एक रनटाइम त्रुटि को फेंक देगा।

late final

अंतिम चर अब देर से भी चिह्नित किए जा सकते हैं:

late final int x = heavyComputation();

यहां पहुंचने के heavyComputationबाद ही कॉल किया जाएगा x। इसके अतिरिक्त, आप late finalबिना एक आरंभक के भी घोषणा कर सकते हैं , जो कि केवल एक lateचर होने के समान है , लेकिन इसे केवल एक बार सौंपा जा सकता है।

late final int x;
// w/e
x = 5; // allowed
x = 6; // forbidden

ध्यान दें कि एक शुरुआती के साथ सभी शीर्ष-स्तरीय या स्थिर चर का अब मूल्यांकन किया जाएगा late, चाहे वे कोई भी हों final

required

पूर्व में एक एनोटेशन ( @required), जिसे अब एक संशोधक के रूप में बनाया गया है। यह किसी भी नामित पैरामीटर (कार्यों या कक्षाओं के लिए) को चिह्नित करने की अनुमति देता है required, जो उन्हें गैर-अशक्त बनाता है:

void allowed({required String word}) => null;

इसका अर्थ यह भी है कि यदि कोई पैरामीटर गैर-अशक्त होना चाहिए , requiredतो उसे डिफ़ॉल्ट मान के रूप में चिह्नित किया जाना चाहिए :

void allowed({String word = 'World'}) => null;

void forbidden({int x}) // compile-time error because x can be null (unassigned)
    =>
    null;

किसी अन्य नामित पैरामीटर को अशक्त होना चाहिए :

void baz({int? x}) => null;

?[]

अशक्त जागरूक ?[]ऑपरेटर को इंडेक्स ऑपरेटर के लिए जोड़ा गया था []:

void main() {
  List<int>? list = [1, 2, 3];

  int? x = list?[0]; // 1
}

सिंटैक्स निर्णय के बारे में यह लेख भी देखें ।

?..

कैस्केड ऑपरेटर के पास अब एक नया अशक्त ऑपरेटर भी है ?..:।

यह निम्न कैसकेड संचालन का कारण बनता है केवल प्राप्तकर्ता निष्पादित नहीं होने पर निष्पादित किया जाता है । इसलिए, ?..कैस्केड अनुक्रम में पहला कैस्केड ऑपरेटर होना चाहिए:

void main() {
  Path? path;

  // Will not do anything if path is null.
  path
    ?..moveTo(3, 4)
    ..lineTo(4, 3);

  // This is a noop.
  (null as List)
    ?..add(4)
    ..add(2)
    ..add(0);
}

Never

भ्रम से बचने के लिए: यह ऐसा कुछ नहीं है जिसके बारे में डेवलपर्स को चिंता करनी होगी। मैं इसे संपूर्णता के लिए उल्लेख करना चाहता हूं।

Neverमें पहले से मौजूद Null( नहींnull ) की तरह एक प्रकार होने जा रहा है dart:core। इन दोनों वर्गों को विस्तारित, कार्यान्वित या मिश्रित नहीं किया जा सकता है, इसलिए उनका उपयोग करने का इरादा नहीं है।

अनिवार्य रूप से, Neverइसका मतलब है कि किसी भी प्रकार की अनुमति नहीं है और Neverखुद को तत्काल नहीं किया जा सकता है।
कुछ भी नहीं है लेकिन Neverसूची List<Never>के सामान्य प्रकार की बाधा को संतुष्ट करता है, जिसका अर्थ है कि इसे खाली होना हैList<Null>हालाँकि, इसमें शामिल हो सकते हैं null:

// Only valid state: []
final neverList = <Never>[
  // Any value but Never here will be an error.
  5, // error
  null, // error

  Never, // not a value (compile-time error)
];

// Can contain null: [null]
final nullList = <Null>[
  // Any value but Null will be an error.
  5, // error
  null, // allowed

  Never, // not a value (compile-time error)
  Null, // not a value (compile-time error)
];

उदाहरण: कंपाइलर List<Never>एक खाली के लिए अनुमान लगाएगा const List<T>
Neverजहाँ तक मैं चिंतित हूँ, प्रोग्रामर द्वारा उपयोग नहीं किया जाना चाहिए।


5
क्या आप कुछ परिदृश्य दे सकते हैं जहाँ Neverउपयोग किया जा सकता है?
रामसेस अल्लामा

2
हमने वास्तव में "[?]" के बजाय अशक्त-संवेदी सूचकांक ऑपरेटर के लिए "[?] का उपयोग करने का निर्णय लिया है। उत्तरार्द्ध व्याकरणिक रूप से थोड़ा अधिक जटिल है, लेकिन यह वही है जो उपयोगकर्ता चाहते हैं।
उदार

@ रामसेमलदामा मैंने कुछ जोड़ा है। विनिर्देशन मैं अधिक उल्लेखों से जुड़ा था।
क्रिएटिव

@ शानदार यह कल्पना और प्रयोग अभी भी पुराना है; इशारा करने के लिए धन्यवाद।
क्रिएटिव

1
यह इंगित किया जाना चाहिए कि late finalसदस्य या उदाहरण चर पर केवल रनटाइम पर जांच करता है। रुकने की समस्या के कारण विकास के समय या संकलन के समय की जाँच करना संभव नहीं है। तो आपको इसके साथ आईडीई की मदद नहीं मिलेगी।
ग्राहम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.