डार्ट अशक्त मुहावरे या सर्वोत्तम अभ्यास की जाँच क्या है?


84

मेरे नक्शे में दोहरे लुकअप से बचने के लिए मेरे पास असाइनमेंट और अशक्त जांच के निम्नलिखित रूप हैं।
क्या डार्ट में ऐसा करने का एक बेहतर या अधिक मुहावरेदार तरीका है?

bool isConnected(a, b){
  List list;
  return (
    ((list = outgoing[a]) != null && list.contains(b)) ||
    ((list = incoming[a]) != null && list.contains(b))
  );
}

जवाबों:


119

इस प्रकार की स्थिति के लिए डार्ट 1.12 अशक्त संचालक उपलब्ध हैं:

bool isConnected(a, b) {
  bool outConn = outgoing[a]?.contains(b) ?? false;
  bool inConn = incoming[a]?.contains(b) ?? false;
  return outConn || inConn;
}

?.अशक्त करने के लिए ऑपरेटर शॉर्ट सर्किट अगर बाएं ओर रिक्त है, और ??ऑपरेटर बाएं ओर वापस लौट आता है यह शून्य नहीं है, और दाएँ हाथ की ओर अन्यथा।

बयान

outgoing[a]?.contains(b)

इस प्रकार या तो nullअगर outgoing[a]यह है null, या नहीं है , तो बूलियन परिणाम का मूल्यांकन करेगा contains(b)

इसका मतलब है कि परिणामी बयान निम्नलिखित में से एक होगा:

bool outConn = null ?? false; // false
bool outConn = false ?? false; // false
bool outConn = true ?? false; // true

वही inConnबूलियन पर लागू होता है , जिसका अर्थ दोनों है inConnऔर outConnगैर-अशक्त होने की गारंटी है, जिससे हम ||दोनों के परिणाम को वापस कर सकते हैं ।


लेखन outgoing[a]?.contains(b)खतरनाक है, कम से कम ग्रूवी शब्दार्थ के साथ, क्योंकि जब outgoingहोता है null, संपूर्ण अभिव्यक्ति का मूल्यांकन करता है null। तो आप वास्तव में कुछ पाने की तरह हो सकता है return (null || true), जो जाँच मोड में फेंक देंगे।
लाडिसक

खुले मुद्दे की कड़ी के लिए धन्यवाद।
z5h

@Ladicek कि बाहर इशारा करने के लिए धन्यवाद। मैंने ??उस समस्या के लिए अपने अद्यतन उत्तर में अशक्त-सहवर्ती ऑपरेटर ( ) को शामिल किया है।
पिक्सेल एलिफेंट


वस्तुओं के फील्ड्स की जांच करने के लिए बस लिखें object?.field ?? true। जहां सच्चा कुछ भी आप चाहते हैं हो सकता है
तिलो

50

अब 4 शून्य जागरूक ऑपरेटर हैं

?? यदि विषय शून्य है, तो एक डिफ़ॉल्ट प्रदान करता है

return subject ?? "defaultIfNull";

?? = विषय को केवल डिफ़ॉल्ट पर सेट करता है यदि विषय शून्य है

यह समान है ?? लेकिन विषय चर को डिफ़ॉल्ट पर सेट करता है यदि यह शून्य है।

subject ??= "defaultIfNull";

?। विषय की संपत्ति तक पहुँचने पर यदि विषय शून्य है तो अपवाद से बचें

object?.xयदि ऑब्जेक्ट अशक्त है, तो अशक्त लौट आएगा, यदि ऑब्जेक्ट अशक्त था, object.xतो अपवाद होगा

...? प्रसार सूची से, अंतिम सूची में एक अशक्त वस्तु से बचें यदि विषय सूची शून्य है

निम्नलिखित का परिणाम है

[
  ...[1, 2],
  null,
]

है [1, 2, null]

अशक्त मूल्य उपयोग से बचने के लिए ...?

var resultingList = [
  ...[1, 2],
  ...?subjectList,
];

2
उपयोग करने के बारे में महत्वपूर्ण टिप्पणी ? : यदि अशक्त संदर्भ aमें शून्य विधि है method(), तो निम्न सिंटैक्स a?.method();विधि को निष्पादित करेगा यदि aशून्य नहीं है।
एलेक्स सेमेनिउक

@AlexSemeniuk, महान बिंदु! लेकिन क्या इस तरह से कुछ करने का कोई तरीका है >>> अगर कोई शून्य नहीं है ... तो एक विधि एक्सवाईजेड () निष्पादित करें, जब यह विधि वस्तु के वर्ग का सदस्य नहीं है ???
यो एप्स

@YoApps क्या मुझे यह स्पष्ट है कि आप एक विधि निष्पादित करना चाहते हैं जो वर्ग हस्ताक्षर का हिस्सा नहीं है? यह किसी भी ओओपी भाषा में करना संभव नहीं है जिससे मैं परिचित हूं।
एलेक्स सेमीनेक

@AlexSemeniuk हाँ, मैंने यह भी कोशिश की, फिर भी पुराने पर वापस काम नहीं कियाif(a!=null){XYZ();}
यो एप्स

1
@YoApps। ओह, आप इस कोड का मतलब है। नहीं, यह डार्ट में संभव नहीं है।
एलेक्स सेमिनेक

15

निम्नलिखित पोस्ट करते हुए, जैसा कि मैंने शीर्षक खोजकर यहां समाप्त किया है।

Https://github.com/dart-lang/sdk/issues/66 के अनुसार , ऐसा लगता है कि "Dart null check idiom or best practice?" है:

सामान्य मामले में कोई शून्य जाँच मुहावरा या सर्वोत्तम अभ्यास नहीं है। यदि अशक्त संचालक आपके मामले में फिट नहीं होते हैं तो सीधे तुलना का उपयोग करें if (object == null)या में if (object != null)


1
उनके पास अब वैकल्पिक है :-)
ओलिवर डिक्सन

0
bool ok<T>(T obj) => obj != null;
bool nul<T>(T obj) => obj == null;

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह कोड क्यों और / या इस बारे में अतिरिक्त संदर्भ प्रदान करता है कि यह प्रश्न इसके दीर्घकालिक मूल्य में सुधार करता है। जवाब कैसे । सधन्यवाद।
एलिटेलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.