डार्ट में रनटाइम प्रकार की जाँच कैसे करें?


103

डार्ट विनिर्देशन स्थिति:

संशोधित प्रकार की जानकारी रनटाइम पर वस्तुओं के प्रकार को दर्शाती है और हमेशा गतिशील टाइपकास्टिंग कंस्ट्रक्शन (उदाहरण के लिए ओफ़्फ़, कास्ट्स, टाइपसेज़ आदि अन्य भाषाओं में) द्वारा क्वियर किया जा सकता है।

बहुत अच्छा लगता है, लेकिन कोई समान instanceofऑपरेटर नहीं है। तो हम डार्ट में रनटाइम टाइप-चेकिंग कैसे करते हैं? क्या यह सभी के लिए संभव है?

जवाबों:


147

isडार्ट में ऑपरेटर-ऑपरेटर कहा जाता है। कल्पना आकस्मिक पाठक के लिए बिल्कुल अनुकूल नहीं है, इसलिए अभी सबसे अच्छा विवरण http://www.dartlang.org/articles/optional-types/ लगता है ।

यहाँ एक उदाहरण है:

class Foo { }

main() {
  var foo = new Foo();
  if (foo is Foo) {
    print("it's a foo!");
  }
}

ऐसा लगता isहै कि विनिर्देश में ऑपरेटर का कोई उल्लेख नहीं है । डार्ट स्रोतों में व्याकरण फ़ाइल के लिए रेफरी करना बेहतर है: code.google.com/p/dart/source/browse/trunk/dart/language/…
Idolon

4
@ आइडलोन, isऑपरेटर को युक्ति के पृष्ठ 59 पर परिभाषित किया गया है, खंड 10.30 'टाइप टेस्ट'
डंकन

4
isऔर डार्ट भाषा के दौरे is!के ऑपरेटरों अनुभाग में पाया जा सकता है ।
घुंघराले

1
न्यू सिंटैक्स हैgetTypeName(dynamic obj) => obj.runtimeType;
महदी इमानी

1
!=लेकिन is!... मुझे भ्रमित करता है यह नहीं करता है
atreeon

38

डार्ट Objectप्रकार का एक runtimeTypeउदाहरण सदस्य है (स्रोत dart-sdkv1.14 से है, यह नहीं जानते कि क्या यह पहले उपलब्ध था)

class Object {
  //...
  external Type get runtimeType;
}

उपयोग:

Object o = 'foo';
assert(o.runtimeType == String);

11
RuntimeType केवल डिबगिंग उद्देश्यों के लिए है और एप्लिकेशन कोड इस पर निर्भर नहीं होना चाहिए। नकली मूल्यों को वापस करने के लिए कक्षाओं द्वारा इसे ओवरराइड किया जा सकता है और संभवतया जब जेएस को हस्तांतरित किया जाता है तो अनुपयोगी मान लौटाता है
गुंटर

1
आपकी टिप्पणी के लिए धन्यवाद, मैं डार्ट के लिए बहुत नया हूं, और मैं सहमत हूं कि runtimeTypeकक्षाओं से आगे निकल सकता है, हालांकि मैं एक कारण के बारे में नहीं सोच सकता कि वे क्यों करेंगे। (बाहरी कोड मान को निर्धारित नहीं कर सकता है कि यह एक गटर है) व्यक्तिगत रूप से, मैं isऔर परावर्तित होता।
सादुलिन

2
यह ठीक है यह यहाँ उल्लेख किया गया है। यह बहुत स्पष्ट नहीं है कि runtimeTypeये सीमाएँ हैं।
गुंटर ज़ोचाउर

गुंटर, क्या यह अभी भी ऐसा मामला है runtimeTypeजिसका उपयोग केवल डिबगिंग उद्देश्यों के लिए किया जाना चाहिए? मैं पूछता हूं क्योंकि ऑब्जेक्ट के लिए डॉक्स में इसका कोई उल्लेख नहीं है, या कहीं और (जो मुझे मिल सकता है)।
मैट सी

1
@ गार्टरज़ोचबॉयर टिप्पणी अब डार्ट 2 में सही नहीं है। अब इसका उपयोग करना ठीक होना चाहिए।
वोवहॉस्ट

18

object.runtimeType वस्तु का प्रकार लौटाता है

उदाहरण के लिए:

print("HELLO".runtimeType); //prints String
var x=0.0;
print(x.runtimeType); //prints double

7
सैबदुलिन का उत्तर पहले से ही समझाता है। मौजूदा लोगों के समान उत्तर को जोड़ने का कोई मतलब नहीं है। उनके जवाब के नीचे की टिप्पणियाँ भी देखें।
गुंटर ज़ोचबॉएर

17

जैसा कि दूसरों ने उल्लेख किया है, डार्ट का isऑपरेटर जावास्क्रिप्ट के instanceofऑपरेटर के बराबर है । हालाँकि, मुझे typeofDart में ऑपरेटर का प्रत्यक्ष एनालॉग नहीं मिला है ।

शुक्र है कि डार्ट: दर्पण प्रतिबिंब एपीआई को हाल ही में एसडीके में जोड़ा गया है, और अब नवीनतम संपादक + एसडीके पैकेज में डाउनलोड के लिए उपलब्ध है । यहाँ एक छोटा डेमो है:

import 'dart:mirrors'; 

getTypeName(dynamic obj) {
  return reflect(obj).type.reflectedType.toString();
}

void main() {
  var val = "\"Dart is dynamically typed (with optional type annotations.)\"";
  if (val is String) {
    print("The value is a String, but I needed "
        "to check with an explicit condition.");
  }
  var typeName = getTypeName(val);
  print("\nThe mirrored type of the value is $typeName.");
}


यह अच्छा समाधान है लेकिन, हमारे पास त्रुटि है: Unsupported operation: dart:mirrors is no longer supported for web apps
महदी इमानी

@Lii यह उत्तर एक्मा TC52 के लिए लिखा गया था। देखें dart.dev/faq
रोब

11

टाइप टेस्टिंग के लिए दो ऑपरेटर हैं: E is TE के लिए टेस्ट टाइप T का उदाहरण है जबकि E is! TE के लिए टेस्ट टाइप T का उदाहरण नहीं है

ध्यान दें कि E is Object हमेशा सच होता है, और null is Tजब तक हमेशा झूठ नहीं होता है T===Object


क्या आप बता सकते हैं कि इसका मतलब क्या है T===Object? डार्ट में ट्रिपल बराबर ऑपरेटर नहीं है, लेकिन आपने इसे डबल बराबर के बजाय इसका उपयोग करने के लिए चुना है, इसलिए मुझे लगता है कि अंतर का महत्व है।
मैट सी

@MattC जो 7 साल से ज्यादा पहले लिखा गया था! मुझे लगता है कि जो मेरा मतलब था null is Objectवह null is Tकिसी भी अन्य प्रकार के t.bh के लिए सही लेकिन गलत होगा, हालांकि मैं कई वर्षों से डार्ट के पास नहीं था इसलिए अब यह निश्चित नहीं हो सकता।
डंकन

2

बस थोड़ा अंतर स्पष्ट करने के लिए isऔर runtimeType। जैसा कि किसी ने पहले ही कहा (और डार्ट V2 + के साथ इसका परीक्षण किया गया) निम्नलिखित कोड है:

class Foo { 
  Type get runtimeType => String;
}
main() {
  var foo = new Foo();
  if (foo is Foo) {
    print("it's a foo!");
  }
  print("type is ${foo.runtimeType}");

}

उत्पादन होगा:

it's a foo! 
type is String

क्या गलत है। अब, मैं कारण नहीं देख सकता कि किसी को ऐसा क्यों करना चाहिए ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.