Cấu trúc điều khiển (Control structures) có thể được coi như là các block code ra lệnh hoặc xác định cho luồng mà các câu lệnh bên trong được thực thi. Chúng cơ bản là những câu lệnh rẽ nhánh của code.
Ví dụ, một block code có thể chạy tuần tự trong đó cấu trúc rẽ nhánh đảm bảo các câu lệnh của nó được thực thi một cách có thứ tự. Một block code cũng có thể chạy theo vòng lặp có các cấu trúc rẽ nhánh đảm bảo các câu lệnh của nó được thực thi lặp đi lặp lại.
Ngôn ngữ Dart cung cấp nhiều câu lệnh có thể điều khiển rẽ nhánh cho block code của bạn.
Chúng ta sẽ tìm hiểu những câu lệnh sau:
if
andelse
for
loopswhile
anddo-while
loopsbreak
andcontinue
switch
andcase
assert
1. Câu lệnh If
Câu lệnh if
cho phép bạn kết hợp các điều kiện trong code, điều kiện cần được đáp ứng trước khi code có thể thực thi.
Hãy xem ví dụ thực tế này để dễ hiểu hơn nhé
Tưởng tượng một sáng thức dậy và bạn chuẩn bị đi chơi. Khi đến cửa, bạn không chắc ngoài trời có mưa hay không. Nếu bên ngoài trời mưa, bạn sẽ mang theo ô bên mình. Nếu trời không mưa, bạn sẽ không cần đến ô nữa và chỉ cần như vậy rồi rời đi thôi. Quyết định cuối cùng của bạn sẽ dựa trên điều kiện thời tiết bên ngoài. Đây cũng là cách hoạt động của các câu lệnh điều kiện.
Điều kiện rẽ nhánh
Hãy xem điều kiện rẻ nhánh của If
:
Luồng trên cho thấy rằng nếu điều kiện đã được đáp ứng, trình biên dịch sẽ thực thi câu lệnh điều kiện và nếu điều kiện chưa được đáp ứng, trình biên dịch sẽ thoát khỏi block code đó mà không thực thi.
Syntax
Hãy xem syntax dưới đây của if
và tìm hiểu cách viết một block code với if
bằng ngôn ngữ Dart
Syntax bắt đầu bằng từ khóa if
theo sau bởi dấu ngoặc đơn (()
). Trong ngoặc đơn, bạn sẽ viết điều kiện của mình. Ví dụ, điều kiện trong thực tế là “sẽ có mưa bên ngoài”. Sau dấu ngoặc đóng ()
), chúng ta chèn một dấu ngoặc nhọn mở ({
), sau đó chuyển sang dòng tiếp theo và viết câu lệnh điều kiện. Đây là code sẽ thực thi nếu điều kiện đúng. Trong ví dụ thực tế, điều này sẽ là ”lấy ô dù”. Sau khi viết câu lệnh điều kiện, chúng ta chuyển sang dòng tiếp theo và chèn dấu ngoặc nhọn đóng (}
) và kết thúc câu lệnh if
Câu lệnh If trong code
Trong ví dụ bên dưới, chúng ta muốn làm trống một danh sách thì điều kiện là danh sách đó phải có chứa phần tử.
Bạn có thể kiểm tra thử liệu một collection có trống hay không bằng cách sử dụng các thuộc tính isEmpty
và isNotEmpty
. isEmpty
là true khi collection đó trống và isNotEmpty
là true
khi collection đó không trống.
Hãy nhớ rằng các thuộc tính có thể được truy cập bằng cách sử dụng toán tử .
Hãy xem ví dụ dưới đây:
main() {
var testList = [2,4,8,16,32];
print(testList);
if(testList.isNotEmpty){
print("Emptying List");
testList.clear();
}
print(testList);
}
Output:
[2, 4, 8, 16, 32]
Emptying List
[]
Trong đoạn code trên, điều kiện là sử dụng thuộc tính isNotEmpty
để kiểm tra xem testList
có trống không (dòng if(testList.isNotEmpty){
). Nếu nó không trống, thì câu lệnh điều kiện được thực thi, đầu tiên sẽ in ra "Emptying List" (dòng print("Emptying List");
) và sau đó xóa tất cả các mục có trong testList
(dòng testList.clear();
).
2. else và else if
Tưởng tượng bạn đang chơi bóng rổ. Khi trận đấu kết thúc chúng ta sẽ biết được đội nào chiến thắng dựa trên số điểm của mỗi đội. Nếu đội A có số điểm nhiều hơn thì đội A sẽ được tuyên bố là chiến thắng. Ngược lại, đội B sẽ là đội chiến thắng.
Nếu chúng ta viết một vài đoạn code cho kịch bản trên, điều đầu tiên chúng ta nghĩ đến có thể là sử dụng câu lệnh if. Nhưng câu lệnh if sẽ không thể tự thực hiện được việc trên bởi vì nó chỉ thực hiện cho một điều kiện và một kết quả. Kịch bản ở trên lại có hai kết quả.
2.1 Câu lệnh else
Dart cung cấp câu lệnh else
. else
được sử dụng với câu lệnh if
và cho trình biên dịch biết phải làm gì nếu điều kiện if
không được đáp ứng.
Điều kiện rẽ nhánh
Nếu điều kiện không được đáp ứng, trình biên dịch sẽ thực thi đoạn code thay thế trước khi thoát.
Syntax
Hãy xem qua Syntax của câu lệnh if-else
Câu lệnh else trong code
Chúng ta sẽ viết đoạn code cho trò bóng rổ ở bên trên nhé.
main() {
var pointsA = 50;
var pointsB = 64;
if(pointsA > pointsB){
print("Team A Wins!");
} else {
print("Team B Wins!");
}
}
Output:
Team B Wins!
Biến pointsA
chứa điểm số của team A, pointsB
chứa điểm số của team B.
Nếu team A có số điểm nhiều hơn team B, pointsA > pointsB
thì in ra Team A Wins!
. Ngược lại thì in ra Team B Wins!
.
Nếu cả hai team đều có cùng số điểm thì sao? điều kiện if
sễ false
và đoạn code của else
sẽ được thực thi và in ra Team B Wins!
. Điều đó thì không đúng lắm và ta sẽ giải quyết vấn đề này ở nội dung bên dưới.
2.2 Câu lệnh else if
câu lệnh else
thì quá tốt nếu chỉ có hai kết quả có thể xảy ra. Tuy nhiên, điều gì sẽ xảy ra nếu chúng ta có nhiều hơn 2 trường hợp?
Dart cũng cung cấp câu lệnh else if
. else if
cũng được sử dụng với câu lệnh if
, tuy nhiên khác với else
bạn phải chỉ định một điều kiện cùng với đoạn code thay thế. Nó sẽ chỉ thực thi nếu điều kiện else if
là true.
Syntax như sau:
else if
cũng có thể được sử dụng với câu lệnh else
:
Hãy giải quyết bài toán đã thảo luận bên trên với câu lệnh else if
nhé!
main() {
var pointsA = 50;
var pointsB = 50;
if(pointsA > pointsB){
print("Team A Wins!");
} else if(pointsB > pointsA) {
print("Team B Wins!");
} else {
print("It's a Tie!");
}
}
Output:
It's a Tie!
3. Toán tử Ternary
Trong Dart có một toán tử cho phép thay thế việc sử dụng câu lệnh if-else
.
Toán tử đó là toán tử Ternary được đại diện bởi ?:
.
Syntax
Hãy xem qua cách mà toán tử này được sử dụng:
Nếu condition là true
, expression1 sẽ được đánh giá và giá trị của nó sẽ được hiển thị. Ngược lại, expression2 sẽ được đánh giá và hiển thị giá trị.
Ví dụ
Hãy nhìn vào ví dụ bên dưới đây. Chúng ta có hai số nguyên a
và b
. Nếu a
lớn hơn b
, thì lấy a
trừ cho b
. Ngược lại, lấy b
trừ cho a
.
main() {
var a = 5;
var b = 2;
var result = a > b ? a - b : b - a;
print(result);
}
Output:
3
Ở dòng var result = a > b ? a - b : b - a;
, chúng ta sử dụng toán tử ?:
. a > b
đại diện cho điều kiện trong khi đó a - b
đại diện cho biểu thức thứ 1 và b - a
đại diện cho biểu thức thứ 2.
Giá trị gán cho a
là 5 và giá trị gán cho b
là 2. Do đó, a > b
là true
. Vì điều kiện đã đúng nên biểu thức 1 (a - b)
sẽ được đánh giá và kết quả trả về là 3
sẽ được chưa trong result
.
Ví dụ trên cũng có thể được viết bằng câu lệnh if-else
main() {
var a = 5;
var b = 2;
var result;
if(a > b){
result = a - b;
} else {
result = b - a;
}
print(result);
}
Output:
3
4. Vòng lặp for
Nếu như bạn phải in 100 bản tài liệu. Bạn sẽ in từng bản riêng lẻ và nhấn nút in 100 lần hay là bạn sẽ đặt lệnh cho máy in in 100 bản và bạn chỉ cần nhấn một lần thôi?
Cái máy in sẽ thực hiện một hành động (in tài liệu) lặp đi lặp lại trong một vòng lặp cho đến khi nó đạt được mục tiêu của nó. (in 100 bản)
Trong lập trình máy tính, đôi khi chúng ta gặp các tình huống trong đó một block code cần được thực thi nhiều lần. Dart cung cấp vòng lặp for cho mục đích đó.
Điều kiện rẽ nhánh
Hãy xem điều kiện rẻ nhánh của vòng lặp for
bên dưới:
Vòng lặp for
cho phép chúng ta xác định một dãy số mà chúng ta muốn vòng lặp chạy.
Iterator có trách nhiệm theo dõi các lần lặp. Giá trị ban đầu của nó là điểm bắt đầu của phạm vi vòng lặp và nó sẽ thay đổi theo mỗi lần lặp.
Syntax
Có nhiều hơn một cách để viết một vòng lặp for
trong ngôn ngữ Dart. Hãy xem thử syntax được khái quát hóa ở bên dưới.
Syntax bắt đầu bằng từ khóa for
theo sau là iterator. Nhưng iterator là gì? và chúng ta xác định nó bằng cách nào?
Iterator mà chúng ta sẽ sử dụng là một biến được gán một dải số. Bạn cần xác định được ba thứ: giá trị ban đầu hay nơi dãy số bắt đầu, giá trị cuối cùng hay nơi nó kết thúc và cách iterator sẽ di chuyển qua dãy (từ giá trị đầu đến giá trị cuối) trong mỗi lần lặp lại của vòng lặp for
. Ví dụ, nó có thể được tăng lên 1 hoặc giảm đi 1.
Tất cả ba điều trên được chỉ định trong dấu ngoặc đơn và được phân tách bằng dấu chấm phẩy ;
Đừng lo lắng quá nhé! Bạn sẽ dễ hình dung hơn khi xem qua ví dụ bên dưới.
Vòng lặp for trong code
Giả sử chúng ta muốn in một thứ gì đó 5 lần. Chúng ta cần xác định được 3 thứ.
- Giá trị ban đầu của iterator: var i = 0 (giá trị ban đầu là 0)
- Giá trị cuối của iterator: i < 5 (lên tới 5)
- Cách iterator di chuyển qua dãy được chỉ định: i++ (tăng thêm 1)
Hãy xem đoạn code bên dưới:
main() {
for(var i = 0; i < 5; i++){
print(i);
}
}
Output:
0
1
2
3
4
Câu lệnh print
được thực thi 5 lần với i
lần lượt được gán một giá trị mới từ 0 đến 4 trong mỗi lần lặp. Biểu thức for
chạy trong 5 lần lặp.
Vòng lặp với một collection
Chúng ta có thể sử dụng vòng lặp for
để thực hiện một vài hành động trên mỗi phần tử trong một collection.
Hãy in từng phần tử trong danh sách màu dưới đây
main() {
var colorList = ['blue', 'yellow', 'green', 'red'];
for(var i = 0; i < colorList.length; i++){
print(colorList[i]);
}
}
Output:
blue
yellow
green
red
Để tạo ra phạm vi cho iterator i
, chúng ta sử dụng thuộc tính length
. iterator của chúng ta sẽ chạy trong phạm vi từ 0 đến nhỏ hơn độ dài của colorList
một đơn vị. Bởi vị thuộc tính length
bắt đầu đếm các phần tử trong danh sách từ số 1 còn i
của chúng ta thì bắt đầu bằng 0.
Đó là lý do mà chúng ta phải viết i < colorList.length
thay vì i <= colorList.length
.
Dạng For-In
Đối với sets và lists, bạn có thể sử dụng dạng lặp for-in.
Vòng lặp for
được sử dụng dưới dạng for-in theo syntax sau:
Hãy lấy ví dụ bên trên và điều chỉnh code một chút để áp dụng dạng mới nhé.
main() {
var colorList = ['blue', 'yellow', 'green', 'red'];
for(var i in colorList){
print(i);
}
}
Output:
blue
yellow
green
red
Đoạn code hoạt động giống như trong ví dụ trước. Tuy nhiên, lần này phạm vi là các phần tử của một collection. Mỗi phần tử khi đến lượt sẽ được gán cho iterator i
và một thao tác sẽ được thực hiện trên nó. Trong trường hợp này, phương thức in sẽ gọi cho từng phần tử.
Kết hợp điều kiện với vòng lặp
Cho đến bây giờ, chúng ta mới chỉ thực hiện một vài thao tác vòng lặp đơn giản với câu lệnh in. Nhưng có rất nhiều thứ hay ho khác mà bạn có thể thực hiện với vòng lặp.
Hãy thử kết hợp một điều kiện với một vòng lặp xem sao nhé!
Trong ví dụ dưới đây, chúng ta có một danh sách các số nguyên trong intList
. Và chúng ta sẽ chỉ in những số nguyên chẵn từ danh sách đó.
main() {
var intList = [6,7,3,9,2,5,4];
for(var i in intList){
if(i % 2 == 0){
print(i);
}
}
}
Output:
6
2
4
Trong dòng for(var i in intList){
, chúng ta truy cập vào từng phần tử trong danh sách intList
. Ở dòng if(i % 2 == 0){
, chúng ta chèn thêm một điều kiện cho các phần tử. Chỉ khi điều kiện là true
thì câu lệnh dòng print(i)
mới được thực thi.
5. Vòng lặp while
Khi sử dụng từ "while" trong một câu, chúng ta liên hệ nó với cấu trúc của thời gian. Trong tiếng Anh, "while" có thể được sử dụng như một liên từ, chỉ sự xuất hiện của một sự kiện trong khi một sự kiện khác đang diễn ra. Ví dụ, bạn có thể nói "I am reading a book while my sister is cooking". Câu này chỉ ra rằng sự kiện, reading a book, sẽ diễn ra song song với sự kiện cooking.
Vòng lặp while
trong ngôn ngữ Dart cũng vậy, Sự kiện A là một điều kiện và sự kiện B là một nội dung code sẽ được thực thi. Phần nội dung code sẽ được thực thi lặp đi lặp lại miễn là điều kiện A được đáp ứng (true
).
Cấu trúc rẻ nhánh
Hãy xem cấu trúc rẻ nhánh của vòng lặp while bên dưới
Nếu điều kiện được thỏa, trình biên dịch sẽ thực thi block code và kiểm tra lại điều kiện. Vòng lặp này tiếp tục diễn ra cho đến khi điều kiện không còn thỏa nữa. Lúc đó trình biên dịch sẽ thoát ra khỏi block code.
Syntax
Syntax của while khá là rõ ràng. Điều kiện để kiểm tra sẽ nằm trong dấu ()
. Theo sau là block code thực thi được nằm trong dấu ngoặc nhọn {}
. Nếu điều kiện true
thì block code sẽ thực thi.
Điều kiện phải là một biểu thức kiểuBoolean
. Nếu điều kiện làtrue
, mã sẽ thực thi. Nếu điều kiệnfalse
, trình biên dịch sẽ thoát code.
Vòng lặp while
trong code
Trong ví dụ bên dưới chúng ta muốn in từ số 1 đến 10 bằng cách sử dụng vòng lặp while
main() {
var count = 1;
while (count <= 10) {
print(count);
count += 1;
}
}
Output:
1
2
3
4
5
6
7
8
9
10
Biến count
đang hoạt động như một biến điều khiển vòng lặp. Nó được khởi tạo với giá trị 1 và trong khi giá trị của nó vẫn nhỏ hơn hoặc bằng 10 thì block code trong ({}
) sẽ tiếp tục thực thi. Block code chỉ đơn giản là in giá trị hiện tại của số đếm (trên dòng print(count);
) và tăng nó lên một đơn vị (trên dòng count += 1;
).
6. Vòng lặp do-while
Dart cũng có một vòng lặp do-while
hoạt động giống hệt như vòng lặp while
với một điểm khác biệt được bổ sung, đó là nó thực thi block code trước khi kiểm tra điều kiện. do-while
đảm bảo rằng mã trong dấu ngoặc nhọn ({}
) sẽ thực thi ít nhất một lần.
Syntax như sau:
Ví dụ:
Hãy xem một ví dụ đơn giản dưới đây để hiểu được sự khác biệt nhỏ giữa while
và do-while
.
Đoạn mã dưới đây khai báo một biến không thay đổi, alwaysOne
, được gán giá trị là 1. Chúng ta muốn in giá trị của alwaysOne
khi nó không phải là 1. Hơi nghịch lý một chút nhỉ!
Vì điều kiện của alwaysOne != 1
không bao giờ có thể true
, giá trị của alwaysOne
sẽ không bao giờ được in phải không?
Nhưng không phải vậy đâu. Hãy chạy cùng một đoạn code bằng cách sử dụng while
và do-while
và xem điều gì sẽ xảy ra nhé!
while
:
main() {
var alwaysOne = 1;
while (alwaysOne != 1){
print("Using while: $alwaysOne");
}
print("Nothing Happened");
}
Output:
Nothing Happened
Chỉ có một thứ được in trong đoạn code trên đó là Nothing Happened
. bởi vì chương trình không bao giờ đi vào vòng lặp while.
do-while
:
main() {
var alwaysOne = 1;
do {
print("Using do-while: $alwaysOne");
} while (alwaysOne != 1);
}
Output:
Using do-while: 1
Trong khi vòng lặp while không thực thi block code thì vòng lặp do-while được thực hiện vì nó kiểm tra điều kiện sau khi thực thi block code.
7. Vòng lặp vô hạn
Khi khai báo vòng lặp while
, hãy nhớ rằng điều kiện cuối cùng phải được đánh giá là false
. Nếu nó không bao giờ được đánh giá là false
và sẽ luôn là true
thì vòng lặp while
sẽ chạy với vô số lần lặp lại dẫn đến chương trình của bạn bị lỗi.
Xem thử ví dụ khi vòng lặp while
chạy tới vô hạn:
main() {
var alwaysOne = 1;
while(alwaysOne == 1) {
print(alwaysOne);
}
}
Khi chương trình trên chạy thì cuối cùng nó sẽ bị sập. Lý do cho điều này là điều kiện được chuyển đến while
sẽ luôn đúng đến vô hạn. alwaysOne
sẽ luôn bằng 1 vì chúng ta không bao giờ gán cho nó một giá trị khác trong suốt chương trình.
8. Câu lệnh break và continue
Trong phần này, chúng ta sẽ học cách kiểm soát các vòng lặp nhiều hơn bằng cách sử dụng câu lệnh break
và continue
.
8.1 Câu lệnh break
break
được sử dụng để dừng sớm một vòng lặp. Khi Dart tìm thấy một câu lệnh break
, nó sẽ ngắt khỏi vòng lặp bất kể các lần lặp đã được hoàn thành hay chưa.
Nó chủ yếu được sử dụng với một câu lệnh điều kiện. Dựa trên điều kiện, vòng lặp sẽ biết cần phải thoát ra hay không.
Hãy xem một ví dụ tương tự như ví dụ chúng ta đã xem xét với vòng lặp for
, chúng ta có một danh sách các số nguyên và chỉ muốn in các số nguyên chẵn từ danh sách.
Tuy nhiên, trong ví dụ này, chúng ta chỉ muốn biết lần xuất hiện đầu tiên của một số nguyên chẵn là bao nhiêu.
main() {
var intList = [7,3,9,6,2,5,4];
for(var i in intList){
if(i % 2 == 0){
print(i);
break;
}
}
}
Output:
6
Trong ví dụ trước, chúng ta muốn in mọi số nguyên chẵn trong danh sách. Tuy nhiên, trong ví dụ này, chúng ta đã chèn một câu lệnh break
trong câu lệnh điều kiện của mình.
Khi số nguyên chẵn đầu tiên được tìm thấy, điều kiện của câu lệnh if
sẽ trở thành true
, dẫn đến việc thực hiện dòng print(i);
và dòng break;
. Ở dòng break;
, vòng lặp bị ngắt, vì vậy chỉ số 6 được in chứ không phải 2 và 4.
8.2 Câu lệnh continue
continue
được sử dụng để bỏ qua bước lặp đang chạy và chuyển sang bước tiếp theo, bất kể vẫn còn dòng code đang được thực thi.
Hãy tưởng tượng bạn chịu trách nhiệm tuyển dụng một nhân viên mới cho công ty của bạn và người đó phải có ít nhất 5 năm kinh nghiệm làm việc. Bạn xem qua danh sách các ứng cử viên. Ứng viên có ít hơn 5 năm kinh nghiệm bị bỏ qua, trong khi ứng viên có hơn 5 năm kinh nghiệm được gọi phỏng vấn.
Chúng ta sẽ lưu trữ kinh nghiệm của các ứng viên trong một danh sách. Kinh nghiệm của ứng viên đầu tiên sẽ ở thứ tự 0, kinh nghiệm của ứng viên thứ hai sẽ ở thứ tự 1, v.v.
Hãy thử viết tình huống này trong Dart và tìm ra thử ứng viên nào sẽ được đi phỏng vấn nhé!
main() {
var experience = [5,1,9,7,2,4];
for(var i = 0; i < experience.length; i++){
var candidateExperience = experience[i];
if(candidateExperience < 5){
continue;
}
print("Call candidate $i for an interiew.");
}
}
Output:
Call candidate 0 for an interiew.
Call candidate 2 for an interiew.
Call candidate 3 for an interiew.
Nếu, trên một lần lặp, giá trị của candidateExperience
nhỏ hơn 5, thì dòng 7 của đoạn code trên được thực thi, nó sẽ bỏ qua lần lặp hiện tại và quay trở lại đầu vòng lặp. Do đó, câu lệnh print
sẽ không bao giờ được thực thi với những phần tử nhỏ hơn 5.
9. Câu lệnh switch - case
Câu lệnh switch
là một câu lệnh điều kiện tương tự if-else
. Nó có các mệnh đề trường hợp khác nhau được chỉ định bởi từ khóa case
, tương tự như các điều kiện trong câu lệnh if-else
. switch
nhận một biểu thức và mệnh đề trường hợp tương đương với biểu thức đó sẽ được thực thi.
switch
khác với if-else
ở chỗ các câu lệnh if
chỉ có thể trả về true
hoặc false
và chỉ có thể được định nghĩa như vậy. Mặt khác, mệnh đề trường hợp không bị giới hạn ở các giá trị boolean
. Tuy nhiên, hãy đảm bảo rằng các mệnh đề trường hợp có cùng kiểu với biểu thức.
Syntax của nó như sau:
Biểu thức sẽ được so sánh với caseClause bằng cách sử dụng ==
. Khi tìm thấy caseClause, câu lệnh điều kiện cho trường hợp cụ thể đó sẽ được thực thi và câu lệnh break
ngắt khỏi câu lệnh switch
vì chỉ một trường hợp có thể được thực thi mà thôi. Nếu không có trường hợp nào bằng với biểu thức, mệnh đề sẽ mặc định được thực thi.
Trong ví dụ bên dưới, chúng ta có command
. Dựa vào giá trị của command
câu lệnh sẽ được in.
main() {
var command = 'OPEN';
switch(command) {
case 'CLOSED':
print('closed');
break;
case 'PENDING':
print('pending');
break;
case 'APPROVED':
print('approved');
break;
case 'DENIED':
print('denied');
break;
case 'OPEN':
print('open');
break;
default:
print('command unknown');
}
}
Output:
open
Khi bạn chạy đoạn code trên, output sẽ hiển thị open
. Do giá trị của command
là OPEN
nên đến trường hợp thứ 5 thì câu lệnh điều kiện print('open')
mới được thực thi.
10. Câu lệnh assert
assert
là một câu lệnh cực kỳ hữu ích cho phép bạn đặt điều kiện cho việc thực thi code. Nó được sử dụng để làm gián đoạn quá trình thực thi bình thường khi điều kiện boolean
là false
.
Syntax của nó như sau:
Tham số đầu tiên được truyền qua assert
là biểu thức đầu vào được đánh giá với kiểu boolean
. Nếu biểu thức đầu vào có giá trị là true
, hàm assert
sẽ không làm gì (chương trình vẫn thực hiện như bình thường). Nếu biểu thức đầu vào có giá trị là false
, hàm assert
sẽ in ra thông báo lỗi.
Tham số thứ hai được truyền qua assert
là một kiểu string
nhằm gắn thông điệp vào assertion
.
Ví dụ:
main() {
var variable;
print(variable);
assert(variable != null);
variable = 5;
print(variable);
}
Output:
null
Unhandled exception:
'file:///usercode/main.dart': Failed assertion: line 5 pos 10: 'variable != null': is not true.
#0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:40:39)
#1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:36:5)
#2 main (file:///usercode/main.dart:5:10)
#3 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:305:19)
#4 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:172:12)
Ở dòng var variable;
của đoạn code trên chúng ta khai báo một biến variable
, mà không gán cho nó một giá trị gì cả. Do đó nó sẽ tương tự như null
.
Ở dòng assert(variable != null);
chúng ta sử dụng câu lệnh assert
và truyền cho nó một biểu thức variable != null
. Vì biểu thức là false
nên các đoạn code phía sau sẽ không được thực thi và một tình huống ngoại lệ được trả ra.
Có thể bạn sẽ nghĩ đến câu lệnh if
vì nó khá tương tự với câu lệnh assert
này.
Hãy điều chỉnh đoạn code bên dưới bằng câu lệnh if-else
thay vì câu lệnh assert
.
main() {
var variable;
print(variable);
if(variable != null){
print('not null');
}
else{
variable = 5;
print(variable);
}
}
Output:
null
5
Đối với If
chương trình tiếp tục chạy và thực thi đến dòng code cuối cùng.
Khi chương trình phát triển và trở thành module, bạn có thể đặt câu lệnh assert
ở bất cứ đâu khi cần cảnh báo các trường hợp ngoại lệ phát sinh.
Kết thúc bài viết về câu điều kiện rẻ nhánh tại đậy. Chúng ta hãy cùng tiếp tục đến với bài viết tiếp theo để tìm hiểu về hàm trong ngôn ngữ Dart nhé!
Bài viết liên quan
Tự học Dart: Các Dart Operators (toán tử) bạn cần biết
Sep 02, 2023 • 18 min read
Flutter cơ bản: Điều cần biết khi lập trình ứng dụng đầu tiên
Aug 23, 2023 • 13 min read
Dart là gì? Giới thiệu cơ bản về ngôn ngữ lập trình Dart
Aug 21, 2023 • 11 min read
Flutter là gì? Vì sao nên học công cụ lập trình Flutter?
Aug 19, 2023 • 11 min read
Flutter cơ bản: Widget Tree, Element Tree & Render Tree
Aug 19, 2023 • 10 min read
So sánh StatelessWidget và StatefulWidget
Jul 17, 2022 • 12 min read