2012-11-07 62 views

回答

39

Dart有兩種類型的可選參數:命名爲位置。在討論差異之前,讓我先討論相似之處。

Dart的可選參數是可選因爲呼叫者在調用函數時不需要爲參數指定一個值。

可選參數只能在任何必需參數後聲明。

可選參數可以有一個默認值,當調用者未指定值時使用該參數。

陣地可選參數

通過[ ]纏繞的參數是一個位置可選參數。下面是一個例子:

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

在上面的代碼,port是可選的,並且具有的80的默認值。

您可以使用或不使用第三個參數來調用getHttpUrl

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

您可以爲函數指定多個位置參數:

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

的可選參數是在位置如果要指定numRetries不能省略port

getHttpUrl('example.com', '/index.html'); 
getHttpUrl('example.com', '/index.html', 8080); 
getHttpUrl('example.com', '/index.html', 8080, 5); 

當然,除非你知道8080和5,這是很難說的顯然是魔力數字。您可以使用名爲可選參數的來創建更易讀的API。

命名可選參數

通過{ }包裹的參數是一個命名可選參數。這裏有一個例子:

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

可以調用getHttpUrl使用或不使用第三個參數。您在調用函數時必須使用參數名稱必須。由於命名參數是按名稱引用

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

,他們可以從他們的聲明不同的順序使用:

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

您可以爲函數指定多個命名參數。

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

我相信命名參數使得更容易理解的調用點,尤其是當有布爾標誌或外的情況下的數字。

如果可選參數是提供

不幸的是,你不能將案件「一個可選的參數沒有提供」和「可選參數得到了默認值」區分檢查。

注:您可以使用位置可選參數命名的可選參數,但不是在同一個函數或方法都。以下是不允許的。

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

?運算符已被棄用。我在飛鏢教程中發現只有scale == null條件。 (expr1?expr2:expr3仍然有效) –

+0

對於函數的多個命名參數,這很難找到!在文檔的構造器部分看起來會更好嗎? ;) – willsquire

+0

根據https://www.dartlang.org/guides/language/language-tour#optional-positional-parameters,默認值現在應該用'='而不是':'指定。 – nbro

相關問題