Sự khác biệt giữa các tham số được đặt tên và vị trí trong Dart là gì?


145

Dart hỗ trợ cả tham số tùy chọn được đặt tên và tham số tùy chọn vị trí. Đâu là sự khác biệt giữa cả hai?

Ngoài ra, làm thế nào bạn có thể biết nếu một tham số tùy chọn đã thực sự được chỉ định?

Câu trả lời:


272

Phi tiêu có hai loại tham số tùy chọn: có tênvị 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, portlà tùy chọn và có giá trị mặc định là 80.

Bạn có thể gọi getHttpUrlcó 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 portnế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 getHttpUrlcó 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!
}

4
? toán tử đã bị phản đối Tôi chỉ tìm thấy tỷ lệ == điều kiện null trong hướng dẫn phi tiêu. (expr1? expr2: expr3 vẫn hoạt động)
Zdeněk Mlčoch

1
Yêu nhiều thông số được đặt tên cho một chức năng, điều này thật khó tìm! Sẽ trông thậm chí tốt hơn trong phần xây dựng của tài liệu? ;)
hỏi

1
Giá trị mặc định bây giờ phải được chỉ định =thay vì :, theo dartlang.org/guides/lingu/ .
nbro

31

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ố tùy chọn (vị trí, tên và mặc định)

>> 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

  • tham số sẽ được tiết lộ với dấu ngoặc nhọn {}
  • tham số ngoặc nhọn là tùy chọn.
  • phải sử dụng tên tham số để gán giá trị được phân tách bằng colan :
  • theo thứ tự tham số ngoặc vuông không quan trọng
  • các tham số loại này giúp chúng ta tránh nhầm lẫn trong khi truyền giá trị cho một hàm có nhiều tham số.

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

  • giống như tham số có tên tùy chọn ngoài ra chúng ta có thể gán giá trị mặc định cho tham số này.
  • có nghĩa là không có giá trị nào được thông qua, giá trị mặc định này sẽ được thực hiệ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

liên kết video: Tùy chọn NamedParameter

liên kết video: OptionsDefaultParameter


3

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');
}

2

Từ doc chúng ta nhận được rằng cả hai positionalnamedtham số là tùy chọn, có nghĩa là tất cả chúng có thể vắng mặt.

Theo tôi, namedcá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 frommsgnamedcác tham số, khi bạn gọi phương thức saybạ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.


Tài liệu nói:> Các tham số tùy chọn có thể được đặt tên hoặc theo vị trí, nhưng không phải cả hai. Trường hợp nó nói rằng các tham số vị trí là tùy chọn?
Markon

Tham số vị trí là kiểu tham số mặc định trong các ngôn ngữ lập trình, được gọi là vị trí vì "đó là tham số đầu tiên hoặc thứ hai, v.v.". Namedcá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
Markon

0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.