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

问题描述 投票:79回答:4

Dart支持命名的可选参数和位置可选参数。两者有什么不同?

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

dart
4个回答
157
投票

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

可选参数的位置是,如果要指定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!
}

2
投票

当使用“paramName:value”语法指定函数的参数时,它是一个命名参数。通过将它们括在[和]括号之间,可以使这些参数可选。可以在以下Hello World程序中演示此功能的基本演示:

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

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

0
投票

doc我们得到positionalnamed参数都是可选的,这意味着它们都可以不存在。

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

String say({String from, String msg})

以上frommsgnamed参数,当你调用方法say时,你必须使用say(from: "xx", msg: "xx")。钥匙不能缺席。

但是,如果您使用位置参数,则您是免费的。


0
投票

在我理解的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

感谢此视频链接给出的明确解释,以及视频创作者的信用。

video link : OptionalPositionalParameters

video link : OptionalNamedParameters

video link : OptionalDefaultParameters

© www.soinside.com 2019 - 2024. All rights reserved.