2012-11-07 25 views

Trả lời

39

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, hãy để tôi thảo luận về những điểm tương đồng đầu tiên.

Thông 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 thông số khi gọi hàm.

thông số tùy chọn chỉ có thể được công bố sau khi bất kỳ thông số cần thiết.

thông số tùy chọn có thể có một giá trị mặc định, được sử dụng khi một người gọi không xác định một giá trị.

thông số tùy chọn Positional

Một tham số bọc bởi [ ] là một tham số tùy chọn vị trí. Dưới đâ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ó một giá trị mặc định của 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 chức năng:

getHttpUrl(String server, String path, [int port=80, int numRetries=3]) { 
    // ... 
} 

Các thông số bắt buộc là vị trí ở chỗ 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 đó là gì. Bạn có thể sử dụng các thông số tùy chọn được đặt tên để tạo các API dễ đọc hơn.

Đặt tên thông số tùy chọn

Một tham số bọc bởi { } là một tham số tùy chọn đặt tên. Dưới đây là 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 thông số khi gọi chức năng.

getHttpUrl('example.com', '/index.html', port: 8080); // port == 8080 
getHttpUrl('example.com', '/index.html');    // port == 80 

Bạn có thể chỉ định nhiều tên tham số cho một hàm:

getHttpUrl(String server, String path, {int port: 80, int numRetries: 3}) { 
    // ... 
} 

Bởi vì tên thông số được tham chiếu theo tên, họ có thể được sử dụng trong một trật tự khác với tuyên bố của họ.

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 thông số được đặt tên giúp trang web cuộc gọi dễ hiểu hơn, đặc biệt khi có cờ boolean hoặ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 thông số tùy chọn vị trí hay tên thông số tùy chọn, nhưng không phải cả hai trong hàm hoặc phương pháp tương tự. Sau đây là không được phép.

thisFunctionWontWork(String foo, [String positonal], {String named}) { 
    // will not work! 
} 
+4

? toán tử đã không được chấp nhận. Tôi đã tìm thấy chỉ có quy mô == null điều kiện trong hướng dẫn phi tiêu. (expr1? expr2: expr3 vẫn hoạt động) –

+0

Yêu cầu nhiều tham số được đặt tên cho một hàm, điều này khó tìm! Nhìn tốt hơn trong phần xây dựng của tài liệu? ;) – willsquire

+0

Các giá trị mặc định sẽ được chỉ định bằng '=' thay vì ':', theo https://www.dartlang.org/guides/language/language-tour#optional-positional-parameters. – nbro

Các vấn đề liên quan