ডার্টে ন্যুয়েবিলিটি কী (ডিফল্টরূপে অ-শুরুর)?


27

আমি নতুন ডার্ট নাল সুরক্ষা ভাষার বৈশিষ্ট্যটি শুনেছি, বর্তমানে " 'নন-নল' পরীক্ষা "। এটি ডিফল্টরূপে নন-অ- প্রবর্তন করার কথা ।

বৈশিষ্ট্যটির বিশদটি এখানে এবং ভাষা গিটহাব ইস্যুতে পাওয়া যাবে

এটি কীভাবে কাজ করে এবং আমি এটি কোথায় চেষ্টা করতে পারি?

উত্তর:


49

নন-অযোগ্য (ডিফল্টরূপে)

নন-অ-ডিলেবল (ডিফল্টরূপে) পরীক্ষাটি বর্তমানে নালসফটি.ডার্টপ্যাড.দেপে পাওয়া যাবে
মনে রাখবেন যে আপনি এখানে পুরো স্পেক এবং এখানে পুরো রোডম্যাপটি পড়তে পারেন ।


ডিফল্টরূপে অপ্রয়োজনীয় অর্থ কী?

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
}

একটি nullable পরিবর্তনশীল এটি ব্যবহার করার আগে আরম্ভ করা প্রয়োজন হয় না। এটি nullডিফল্ট হিসাবে সূচনা করা হয়:

void main() {
  String? word;

  print(word); // prints null
}

!

সংযোজন !কোনো ভেরিয়েবলে eএকটি নিক্ষেপ করা হবে রানটাইম এরর যদি eনাল এবং অন্যথায় একটি রূপান্তর অ nullable মান 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কোনও সদস্য বা উদাহরণে চলক কেবল রানটাইমের সময় পরীক্ষা করে। থামার সমস্যার কারণে বিকাশের সময় বা সংকলনের সময় এটি পরীক্ষা করা সম্ভব নয়। সুতরাং আপনি এটির সাথে আইডিই সহায়তা পাবেন না।
গ্রাহাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.