Dart支持命名的可选参数和位置的可选参数。两者之间有什么区别?
另外,如何判断是否实际指定了可选参数?
Dart支持命名的可选参数和位置的可选参数。两者之间有什么区别?
另外,如何判断是否实际指定了可选参数?
Answers:
Dart有两种类型的可选参数:named和positional。在讨论差异之前,让我先讨论相似之处。
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!
}
根据我的理解,在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
>>可选的命名参数
例:
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
感谢您从此视频链接中获得清晰的解释,感谢视频创作者。
从文档中我们可以看到positional
和named
参数都是可选的,这意味着它们都可以不存在。
我认为named
参数比参数更严格positional
。例如,如果您声明这样的方法:
String say({String from, String msg})
在from
和上面msg
是named
参数,调用方法say
时必须使用say(from: "xx", msg: "xx")
。键不能不存在。
但是,如果您使用位置参数,则可以自由使用。
Named
之所以这样称呼参数,是因为您实际上可以通过名称而不是位置来识别它们(如果您切换两个已命名参数的位置,则没有关系)。见上面从Savaranaraja答案
位置参数:
它们与默认参数相同。例如:
void add(int x, [int y = 3]);
此处y的默认值为3
命名参数:
这些参数可以通过传递参数名称后跟传递的值来以任何顺序传递。例如:
void sum({int num1, int num2});
该函数的调用方式如下:
sum(num1: 12, num2: 24);
还命名的参数也可以具有默认值。