ডার্টে রানটাইম টাইপ চেকিং কিভাবে করবেন?


110

ডার্ট স্পেসিফিকেশন বলে:

সংশোধিত প্রকারের তথ্য রানটাইমের সময় অবজেক্টের ধরণের প্রতিবিম্বিত করে এবং সর্বদা গতিশীল টাইপচেকিং কনস্ট্রাক্টগুলি (অন্য ভাষায় উদাহরণস্বরূপ, ক্যাসেট, টাইপকেস ইত্যাদির এনালগগুলি) দ্বারা অনুসন্ধান করা যেতে পারে।

দুর্দান্ত instanceofলাগছে , তবে কোনও পছন্দসই অপারেটর নেই। সুতরাং আমরা কিভাবে ডার্টে রানটাইম টাইপ-চেকিং করবো? এটা কি আদৌ সম্ভব?

উত্তর:


159

ইনস্ট্যান্ট-অপারেটর isডার্টে ডাকা হয়। অনুমানটি কোনও নৈমিত্তিক পাঠকের পক্ষে একেবারেই বন্ধুত্বপূর্ণ নয়, সুতরাং এখনই সেরা বর্ণনাটি মনে হচ্ছে http://www.dartlang.org/articles/optional-tyype/

এখানে একটি উদাহরণ:

class Foo { }

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

দেখে মনে হচ্ছে isস্পেসিফিকেশনে অপারেটরের কোনও উল্লেখ নেই । ডার্ট উত্সগুলিতে ব্যাকরণ ফাইলটি উল্লেখ করা ভাল: কোড. google.com/p/dart/source/browse/trunk/dart/language/…
আইডলন

4
@ ইডলন, isঅপারেটরটি অনুমানের পৃষ্ঠার 59 পৃষ্ঠায় সংজ্ঞায়িত হয়েছে, বিভাগ 10.30 'টাইপ টেস্ট'
ডানকান

4
isএবং ডার্ট ভাষা সফরের অপারেটর বিভাগে is!পাওয়া যাবে ।
কোঁকড়া

4
নতুন বাক্য getTypeName(dynamic obj) => obj.runtimeType;
মাহদি ইমানি

4
!=কিন্তু is!... আমাকে বিভ্রান্ত করে না এটি
অ্যাট্রিওন

40

ডার্ট Objectটাইপের একটি runtimeTypeউদাহরণ সদস্য রয়েছে (উত্সটি dart-sdkv1.14 থেকে এসেছে, জানেন না এটি আগে উপলব্ধ ছিল কিনা)

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

ব্যবহার:

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

11
রানটাইমটাইপ কেবল ডিবাগিং উদ্দেশ্যে হয় এবং অ্যাপ্লিকেশন কোড এটির উপর নির্ভর করে না। এটি জাল মানগুলি ফিরিয়ে দেওয়ার জন্য ক্লাসগুলির দ্বারা ওভাররাইড করা যেতে পারে এবং জেএস
স্থানান্তরিত

4
আপনার মন্তব্যের জন্য ধন্যবাদ, আমি ডার্টে বেশ নতুন, এবং আমি সম্মত হলাম যে runtimeTypeক্লাসগুলি আরও বেশি হয়ে যাবে, যদিও তারা কেন করবে তার কারণ আমি ভাবতে পারি না। (বহিরাগত কোডটি এটি প্রাপ্তির মান সাইনস সেট করতে পারে না) ব্যক্তিগতভাবে, আমি আঁকড়ে থাকব isএবং প্রতিবিম্বিত হব ।
শেবেদুলিন

4
এটা এখানে উল্লেখ করা হয়েছে ঠিক আছে। runtimeTypeএই সীমাবদ্ধতা আছে যে খুব সুস্পষ্ট নয় ।
গন্টার জ্যাচবাউয়ার

গানটার, এখনও কি এটি runtimeTypeকেবল ডিবাগিংয়ের উদ্দেশ্যে ব্যবহার করা উচিত? আমি জিজ্ঞাসা করেছি কারণ অবজেক্টের জন্য ডক্সে বা অন্য কোথাও (যা আমি খুঁজে পেতে পারি) এর কোনও উল্লেখ নেই।
ম্যাট সি

4
@ গন্তেরজ্যাচবাউর মন্তব্য আর ডার্ট ২ এ আর সত্য নয় now এটি এখনই ব্যবহার করা ভাল।
ভোভোস্ট ইস্ট

21

object.runtimeType বস্তুর ধরণটি প্রদান করে

উদাহরণ স্বরূপ:

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

7
শেবেদুলিনের উত্তর ইতিমধ্যে এটি ব্যাখ্যা করে। বিদ্যমান উত্তরগুলির মতো একই উত্তর যুক্ত করার কোনও মানে নেই। তার উত্তর নীচে মন্তব্য দেখুন।
গন্টার জ্যাচবাউয়ার

17

অন্যরা যেমন উল্লেখ করেছেন, ডার্টের isঅপারেটরটি জাভাস্ক্রিপ্টের instanceofঅপারেটরের সমতুল্য । তবে আমি typeofডার্টে অপারেটরের সরাসরি উপমা খুঁজে পাইনি ।

ধন্যবাদ ডার্ট: মিরর প্রতিবিম্ব এপিআই সম্প্রতি এসডিকে যুক্ত হয়েছে এবং এটি সর্বশেষতম সম্পাদক + এসডিকে প্যাকেজে ডাউনলোডের জন্য উপলব্ধ । একটি সংক্ষিপ্ত ডেমো এখানে:

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
মাহদি ইমানি

@ লিই এই উত্তরটি ইকমা টিসি 52-র জন্য লেখা হয়েছিল। ডার্ট.দেব
রব

12

টাইপ টেস্টিংয়ের জন্য দুটি অপারেটর রয়েছে: E is TE এর জন্য পরীক্ষামূলক টাইপের টির উদাহরণ রয়েছে যখন E is! TE এর জন্য টেস্টগুলি টাইপ টি এর উদাহরণ নয় tests

নোট যে E is Objectসর্বদা সত্য, এবং null is Tসর্বদা মিথ্যা যদি না থাকে T===Object


আপনি বোঝাতে পারেন বলতে কি বোঝায় T===Object? ডার্টের ট্রিপল ইক্যুয়াল অপারেটর নেই, তবে আপনি এটি দ্বিগুণ সমান না হয়ে ব্যবহার করতে পছন্দ করেছেন, তাই আমি ধরে নিই পার্থক্যের তাত্পর্য রয়েছে।
ম্যাট সি

@ ম্যাটসি যেটি 7 বছরেরও বেশি আগে লেখা হয়েছিল! আমি মনে করি আমার অর্থ null is Objectযা সত্য তা কিন্তু null is Tঅন্য যে কোনও ধরণের টি। টিবিএইচ এর পক্ষে মিথ্যা ছিল যদিও আমি বহু বছর ধরে ডার্টের কাছাকাছি আসছি না তাই নিশ্চিত হওয়া যায় না।
ডানকান

5

শুধু একটু মধ্যে পার্থক্য নির্মল isএবং runtimeType। যেমন কেউ ইতিমধ্যে বলেছে (এবং এটি ডার্ট ভি 2 + দিয়ে পরীক্ষা করা হয়েছিল) নিম্নলিখিত কোডটি:

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

যা ভুল। এখন, কারো কেন এমনটি করা উচিত তা আমি দেখতে পাচ্ছি না ...


0

সহজভাবে ফোন করুন

মুদ্রণ (অজানাডাটাটাইপ.আরুনটাইম টাইপ)

তথ্য উপর।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.