আমি নতুন ডার্ট নাল সুরক্ষা ভাষার বৈশিষ্ট্যটি শুনেছি, বর্তমানে " 'নন-নল' পরীক্ষা "। এটি ডিফল্টরূপে নন-অ- প্রবর্তন করার কথা ।
বৈশিষ্ট্যটির বিশদটি এখানে এবং ভাষা গিটহাব ইস্যুতে পাওয়া যাবে ।
এটি কীভাবে কাজ করে এবং আমি এটি কোথায় চেষ্টা করতে পারি?
আমি নতুন ডার্ট নাল সুরক্ষা ভাষার বৈশিষ্ট্যটি শুনেছি, বর্তমানে " 'নন-নল' পরীক্ষা "। এটি ডিফল্টরূপে নন-অ- প্রবর্তন করার কথা ।
বৈশিষ্ট্যটির বিশদটি এখানে এবং ভাষা গিটহাব ইস্যুতে পাওয়া যাবে ।
এটি কীভাবে কাজ করে এবং আমি এটি কোথায় চেষ্টা করতে পারি?
উত্তর:
নন-অ-ডিলেবল (ডিফল্টরূপে) পরীক্ষাটি বর্তমানে নালসফটি.ডার্টপ্যাড.দেপে পাওয়া যাবে ।
মনে রাখবেন যে আপনি এখানে পুরো স্পেক এবং এখানে পুরো রোডম্যাপটি পড়তে পারেন ।
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আমি যতটা উদ্বিগ্ন প্রোগ্রামারদের দ্বারা ব্যবহার করার কথা নয়।
late finalকোনও সদস্য বা উদাহরণে চলক কেবল রানটাইমের সময় পরীক্ষা করে। থামার সমস্যার কারণে বিকাশের সময় বা সংকলনের সময় এটি পরীক্ষা করা সম্ভব নয়। সুতরাং আপনি এটির সাথে আইডিই সহায়তা পাবেন না।
Neverপারেন যেখানে ব্যবহার করা যেতে পারে?