2011-10-10 27 views
21

डार्ट विनिर्देश राज्यों:डार्ट में रनटाइम प्रकार की जांच कैसे करें?

reified प्रकार की जानकारी क्रम में वस्तुओं के प्रकार को दर्शाता है और हमेशा गतिशील typechecking निर्माणों द्वारा पूछे जा सकता है (instanceof का एनालॉग, डाले, typecase अन्य भाषाओं में आदि)।

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

उत्तर

22

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

class Foo { } 

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

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

+3

@Idolon, 'is' ऑपरेटर spec के पृष्ठ 59 पर परिभाषित किया गया है, खंड 10.30 'टाइप टेस्ट' – Duncan

6

प्रकार के परीक्षण के लिए दो ऑपरेटरों रहे हैं:

यहाँ एक उदाहरण है ई के लिए E is T परीक्षण प्रकार टी का एक उदाहरण है, जबकि ई के लिए E is! T परीक्षण नहीं प्रकार टी का एक उदाहरण

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

12

जैसा कि अन्य ने उल्लेख किया है, डार्ट का is ऑपरेटर जावास्क्रिप्ट के instanceof ऑपरेटर के बराबर है। हालांकि, मुझे डार्ट में typeof ऑपरेटर का सीधा एनालॉग नहीं मिला है।

शुक्र है कि dart:mirrors reflection API को हाल ही में एसडीके में जोड़ा गया है, और अब latest Editor+SDK package में डाउनलोड के लिए उपलब्ध है। यहाँ एक छोटा डेमो है:

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."); 
} 
1

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

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

उपयोग:

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

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

+0

पर पारदर्शी होने पर अनुपयोगी मूल्य लौटाता है, आपकी टिप्पणी के लिए धन्यवाद, मैं डार्ट के लिए काफी नया हूं, और मैं मानता हूं कि 'रनटाइम टाइप' कक्षाओं से अधिक हो सकता है, हालांकि मैं ' एक कारण के बारे में सोचें कि वे क्यों करेंगे। (बाहरी कोड मान को सेट नहीं कर सकता है यह एक गेटर है) व्यक्तिगत रूप से, मैं 'is' और प्रतिबिंब के साथ रहना होगा। – sbedulin

+0

यह ठीक है यहां उल्लेख किया गया है। यह बहुत स्पष्ट नहीं है कि 'रनटाइम टाइप' में इन सीमाएं हैं। –