Câu trả lời:
Phi tiêu có hai loại tham số tùy chọn: có tên và vị trí . Trước khi tôi thảo luận về sự khác biệt, trước tiên hãy để tôi thảo luận về những điểm tương đồng.
Các tham số tùy chọn của Dart là tùy chọn trong đó người gọi không bắt buộc phải chỉ định giá trị cho tham số khi gọi hàm.
Các tham số tùy chọn chỉ có thể được khai báo sau bất kỳ tham số cần thiết nào.
Các tham số tùy chọn có thể có một giá trị mặc định, được sử dụng khi người gọi không chỉ định giá trị.
Thông số tùy chọn vị trí
Một tham số được bao bọc bởi [ ]
một tham số tùy chọn vị trí. Đây là một ví dụ:
getHttpUrl(String server, String path, [int port=80]) {
// ...
}
Trong đoạn mã trên, port
là tùy chọn và có giá trị mặc định là 80
.
Bạn có thể gọi getHttpUrl
có hoặc không có tham số thứ ba.
getHttpUrl('example.com', '/index.html', 8080); // port == 8080
getHttpUrl('example.com', '/index.html'); // port == 80
Bạn có thể chỉ định nhiều tham số vị trí cho một hàm:
getHttpUrl(String server, String path, [int port=80, int numRetries=3]) {
// ...
}
Các tham số tùy chọn là vị trí mà bạn không thể bỏ qua port
nếu bạn muốn chỉ định numRetries
.
getHttpUrl('example.com', '/index.html');
getHttpUrl('example.com', '/index.html', 8080);
getHttpUrl('example.com', '/index.html', 8080, 5);
Tất nhiên, trừ khi bạn biết 8080 và 5 là gì, thật khó để nói những con số ma thuật rõ ràng đó là gì. Bạn có thể sử dụng các tham số tùy chọn được đặt tên để tạo các API dễ đọc hơn.
Các tham số tùy chọn được đặt tên
Một tham số được bao bọc bởi { }
một tham số tùy chọn có tên. Đây là một ví dụ:
getHttpUrl(String server, String path, {int port = 80}) {
// ...
}
Bạn có thể gọi getHttpUrl
có hoặc không có tham số thứ ba. Bạn phải sử dụng tên tham số khi gọi hàm.
getHttpUrl('example.com', '/index.html', port: 8080); // port == 8080
getHttpUrl('example.com', '/index.html'); // port == 80
Bạn có thể chỉ định nhiều tham số được đặt tên cho một hàm:
getHttpUrl(String server, String path, {int port = 80, int numRetries = 3}) {
// ...
}
Bởi vì các tham số được đặt tên được tham chiếu theo tên, chúng có thể được sử dụng theo thứ tự khác với khai báo của chúng.
getHttpUrl('example.com', '/index.html');
getHttpUrl('example.com', '/index.html', port: 8080);
getHttpUrl('example.com', '/index.html', port: 8080, numRetries: 5);
getHttpUrl('example.com', '/index.html', numRetries: 5, port: 8080);
getHttpUrl('example.com', '/index.html', numRetries: 5);
Tôi tin rằng các tham số được đặt tên làm cho các trang web cuộc gọi dễ hiểu hơn, đặc biệt là khi có các cờ boolean hoặc các số ngoài ngữ cảnh.
Kiểm tra nếu tham số tùy chọn được cung cấp
Thật không may, bạn không thể phân biệt giữa các trường hợp "một tham số tùy chọn không được cung cấp" và "một tham số tùy chọn được cung cấp với giá trị mặc định".
Lưu ý: Bạn có thể sử dụng tham số tùy chọn vị trí hoặc tham số tùy chọn được đặt tên, nhưng không phải cả hai trong cùng một chức năng hoặc phương thức. Những điều sau đây không được phép.
thisFunctionWontWork(String foo, [String positonal], {String named}) {
// will not work!
}
Trong sự hiểu biết của tôi, tham số phương thức có thể được đưa ra theo hai loại.
>> Tham số bắt buộc
Tham số bắt buộc là tham số kiểu cũ biết rõ mà tất cả chúng ta đều quen thuộc với nó
ví dụ :
findVolume(int length, int breath, int height) {
print('length = $length, breath = $breath, height = $height');
}
findVolume(10,20,30);
đầu ra:
length = 10, breath = 20, height = 30
>> Tham số vị trí tùy chọn
tham số sẽ được tiết lộ với dấu ngoặc vuông [] & tham số ngoặc vuông là tùy chọn.
thí dụ:
findVolume(int length, int breath, [int height]) {
print('length = $length, breath = $breath, height = $height');
}
findVolume(10,20,30);//valid
findVolume(10,20);//also valid
đầu ra:
length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null // no value passed so height is null
>> Tham số được đặt tên tùy chọn
thí dụ:
findVolume(int length, int breath, {int height}) {
print('length = $length, breath = $breath, height = $height');
}
findVolume(10,20,height:30);//valid & we can see the parameter name is mentioned here.
findVolume(10,20);//also valid
đầu ra:
length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null
>> Tham số mặc định tùy chọn
thí dụ:
findVolume(int length, int breath, {int height=10}) {
print('length = $length, breath = $breath, height = $height');
}
findVolume(10,20,height:30);//valid
findVolume(10,20);//valid
đầu ra:
length = 10, breath = 20, height = 30
length = 10, breath = 20, height = 10 // default value 10 is taken
cảm ơn vì lời giải thích rõ ràng được đưa ra từ liên kết video này, tín dụng cho người tạo video.
liên kết video: OptionsPositableParameter
Khi tham số của hàm được chỉ định bằng cú pháp "paramName: value", thì đó là tham số được đặt tên. Các tham số như vậy có thể được hiển thị tùy chọn bằng cách đặt chúng giữa dấu ngoặc [và]. Một minh chứng thô sơ về chức năng này có thể được thể hiện trong chương trình Hello World sau đây:
sayHello([String name = ' World!']) {
print('Hello, ${name}');
}
void main() {
sayHello('Govind');
}
Từ doc chúng ta nhận được rằng cả hai positional
và named
tham số là tùy chọn, có nghĩa là tất cả chúng có thể vắng mặt.
Theo tôi, named
các thông số nghiêm ngặt hơn so với thông số positional
. Ví dụ: nếu bạn khai báo một phương thức như vậy:
String say({String from, String msg})
Trên đây from
và msg
là named
các tham số, khi bạn gọi phương thức say
bạn phải sử dụng say(from: "xx", msg: "xx")
. Các phím không thể vắng mặt.
Tuy nhiên nếu bạn sử dụng các tham số vị trí, bạn sẽ được tự do.
Named
các tham số được gọi như vậy bởi vì bạn thực sự có thể xác định chúng theo tên chứ không phải theo vị trí (nếu bạn chuyển đổi vị trí của hai param được đặt tên, điều đó không thành vấn đề). Xem câu trả lời trên từ Savaranaraja
Thông số vị trí:
Chúng giống như các tham số mặc định. Ví dụ:
void add(int x, [int y = 3]);
Ở đây y có giá trị mặc định là 3
Các thông số được đặt tên:
Đây là các tham số có thể được truyền theo bất kỳ thứ tự nào bằng cách chuyển tên của tham số theo sau là giá trị được truyền. Ví dụ:
void sum({int num1, int num2});
Hàm này được gọi như thế này:
sum(num1: 12, num2: 24);
Các tham số cũng được đặt tên cũng có thể có các giá trị mặc định.