Hàm trong Dart
Hàm là một khối lệnh thực hiện một tác vụ gì đó, khối lệnh này được dùng nhiều lần nên gom chúng tại thành một hàm. Trong Dart mọi thứ đều là đối tượng nên hàm cũng là một đối tượng (kế thừa Function).
Đây là một khai báo hàm
double tinhtong(var a, double b, double c) { return a + b + c; } //HOẶC double tinhtong(var a, double b, double c) { return a + b + c; } //GỌI HÀM var x = tinhtong(1,2,3); print(x); //6.0
Như vậy khi khai báo hàm ta có thể có các thành phần sau:
- Chỉ ra kiểu giá trị trả về của hàm (ví dụ
double
), giá trị trả về bằng biểu thức của lệnhreturn
. Với Dart thiếu việc khai báo kiểu giá trị trả về hàm vẫn hoạt động tốt. Còn khi có chỉ rõ kiểu trả về thì giá trị trong biểu thứcreturn
phái trùng với kiểu khai báo hàm. - Tham số được liệt kê sau tên hàm trong cặp
()
như trên có ba tham số a,b,c - Hàm kết thúc khi chạy hết khối lệnh hoặc gặp lệnh
return
, giá trị hàm là biểu thức saureturn
, nếu thiếu giá trị hàm sẽ lànull
- Gọi hàm thì viết tên hàm và truyền đúng tham số theo thứ tự yêu khai báo
Giá trị tham số mặc định của hàm
Nếu bạn muốn tham số có giá trị mặc định, nghĩa là khi gọi hàm mà thiếu giá trị cho tham số đó, thì nó sẽ nhận mặc định. Ví dụ
double tinhtong(var a, {double b:1, double c:2}) { return a + b + c; } var v1 = tinhtong(1); print(v1); //4.0 var v2 = tinhtong(1, c:10); print(v2); //12.0 var v3 = tinhtong(1, c:2, b:10); print(v3); //13.0
Hàm trên tham số b mặc định là 1, c mặc định là 2. Nếu không chỉ ra tham số này khi gọi nó sẽ dùng mặc định, còn muốn
chỉ ra khi gọi thì truyền theo cú pháp tên_tham_số:giá_trị
, như ví dụ trên tinhtong(1, c:2, b:10)
Hàm với tham số tùy chọn
Các tham số tùy chọn của hàm có nghĩa là khi họi hàm có sử dụng hoặc không. Các tham số tùy chọn gom lại trong []
,
nếu khi gọi hàm không có tham số này thì nó nhận giá trị null
double tinhtong(var a, [double b, double c]) { var tong = a; if (b != null) tong += a; tong += (c!=null) ? c: 0; } print(tinhtong(1)); //1.0 print(tinhtong(1,2)); //3.0; print(tinhtong(1,2,3)); //6.0;
Hàm với kỹ hiệu mũi tên =>
Với những hàm chỉ có một biểu thức trả về luôn, thì có thể có cách viết ngắn gọn bằng ký hiệu mũi tên
double tinhtong(var a, var b) { return a + b; } // Có thể viết lại thành double tinhtong(var a, var b) => a + b;
Hàm ẩn danh - lambda - closure
Hầu hết khai báo hàm là có tên hàm, tuy nhiên trong nhiều ngữ cảnh khai báo hàm và không dùng đến tên, hàm đó gọi
là hàm ẩn danh còn gọi là lambda
hoặc closure
Tạo ra hàm ẩn danh thì làm như hàm có tên bình thường, chỉ có điều phần kiểu trả về và tên bị thiếu.
(var a, var b) { return a + b; }; //Có thể dùng ký hiệu mũi tên () => {} (var a, var b) => { return a + b; } //Nếu chỉ có 1 biểu thức trả về như trên có thể viết gọn hơn (var a, var b) => return a + b;
Khai báo trên là hàm ẩn danh, nhưng để sử dụng nó thì ra lệnh cho nó chạy luôn hoặc gán nó vào một biến rồi dùng biến gọi hàm.
//Khai báo xong chạy luôn var x = (var a, var b) { return a + b; }(5,6); print(x); //11
//Gán hàm ẩn danh vào biến ham, rồi dùng nó chạy var ham = (var a, var b) { return a + b; }; print(ham(10,11)); //21
Hàm ẩn danh rất tiện dụng để làm tham số (callback) trong các hàm khác, thậm chí khai báo luôn một ẩn danh ở tham số hàm
f1(var a, var b, var printmessage) { var c = a + b; printmessage(c); } f1(1, 2, (x) { print('Tổng là: $x');}); //Tổng là: 3 f1(1, 2, (z) => print('SUM = $z')); //SUM = 3