经常搞不清楚dart命名参数比位置参数的区别?现在我们来对比一下,位置参数与命名参数的区别。

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]) {
  // ...
}

可选参数是位置参数,如果要指定numRetriesport

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('example.com', '/index.html', port: 8080); // port == 8080
getHttpUrl('example.com', '/index.html');             // port == 80

您可以为一个函数指定多个命名参数:

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

因为命名参数是按名称引用的,所以它们的使用顺序可以不同于它们的声明。

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