Dart中的命名参数和位置参数有什么区别?


145

Dart支持命名的可选参数和位置的可选参数。两者之间有什么区别?

另外,如何判断是否实际指定了可选参数?

Answers:


272

Dart有两种类型的可选参数:namedpositional。在讨论差异之前,让我先讨论相似之处。

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

可选参数是位置性的,port如果您要指定则不能省略numRetries

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

4
?不推荐使用该运算符。我在飞镖教程中只发现了scale == null条件。(?表达式1表达式2:表达式3仍然有效)
兹德涅克Mlčoch

1
喜欢一个函数的多个命名参数,这很难找到!在文档的构造函数部分看起来会更好吗?;)
willsquire 2014年

1
根据dartlang.org/guides/language/…,现在应该使用=而不是来指定默认值。:
nbro

31

根据我的理解,在Dart中,方法参数可以分为两种类型。

  • 必填参数
  • 可选参数(位置,名称和默认值)

>>必填参数

必需参数是我们都熟悉的众所周知的旧样式参数

例如

findVolume(int length, int breath, int height) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,30);

输出:

length = 10, breath = 20, height = 30

>>可选位置参数

参数将用方括号[]公开,方括号参数是可选的。

例:

findVolume(int length, int breath, [int height]) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,30);//valid
findVolume(10,20);//also valid

输出:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null // no value passed so height is null

>>可选的命名参数

  • 参数将用大括号{}公开
  • 大括号括起来的参数是可选的。
  • 必须使用参数名称来分配一个用colan分隔的值
  • 以大括号括起来的参数顺序无关紧要
  • 这些类型参数有助于我们避免在传递具有多个参数的函数的值时造成混淆。

例:

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

输出:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null

>>可选的默认参数

  • 与可选的命名参数相同,此外,我们可以为此参数分配默认值。
  • 这意味着没有值传递,将采用默认值。

例:

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 

输出:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = 10 // default value 10 is taken

感谢您从此视频链接中获得清晰的解释,感谢视频创作者。

视频链接:OptionalPositionalParameters

视频链接:OptionalNamedParameters

视频链接:OptionalDefaultParameters


3

当使用“ paramName:value”语法指定函数的参数时,该函数为命名参数。通过将这些参数括在[和]括号之间,可以使其成为可选参数。下面的Hello World程序可以演示该功能的基本说明:

sayHello([String name = ' World!']) {
  print('Hello, ${name}');
}

void main() {
  sayHello('Govind');
}

2

文档中我们可以看到positionalnamed参数都是可选的,这意味着它们都可以不存在。

我认为named参数比参数更严格positional。例如,如果您声明这样的方法:

String say({String from, String msg})

from和上面msgnamed参数,调用方法say时必须使用say(from: "xx", msg: "xx")。键不能不存在。

但是,如果您使用位置参数,则可以自由使用。


该文档说:>可选参数可以是命名参数,也可以是位置参数,但不能同时使用。它在哪里说位置参数是可选的?
马肯

位置参数是编程语言中参数的默认样式,称为位置参数,因为“它是第一个参数,或第二个参数,等等”。 Named之所以这样称呼参数,是因为您实际上可以通过名称而不是位置来识别它们(如果您切换两个已命名参数的位置,则没有关系)。见上面从Savaranaraja答案
MARKON

0

位置参数:

它们与默认参数相同。例如:

void add(int x, [int y = 3]);

此处y的默认值为3

命名参数:

这些参数可以通过传递参数名称后跟传递的值来以任何顺序传递。例如:

void sum({int num1, int num2});

该函数的调用方式如下:

sum(num1: 12, num2: 24);

还命名的参数也可以具有默认值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.