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]) {
// ...
}
Необязательные параметры являются позиционными , их нельзя пропустить, 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!
}
=
вместо :
, согласно dartlang.org/guides/language/… .
В 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
Спасибо за четкое объяснение, данное по этой ссылке на видео, спасибо создателю видео.
ссылка на видео: OptionalPositionalParameters
Когда параметр функции указывается с использованием синтаксиса paramName: value, это именованный параметр. Такие параметры можно сделать необязательными, заключив их в квадратные скобки [и]. Элементарную демонстрацию этой функции можно продемонстрировать в следующей программе Hello World:
sayHello([String name = ' World!']) {
print('Hello, ${name}');
}
void main() {
sayHello('Govind');
}
Из дока мы получаем , что оба positional
и named
параметры не являются обязательными, что означает , что все они могут отсутствовать.
На мой взгляд, named
параметры строже, чемpositional
. Например, если вы объявите такой метод:
String say({String from, String msg})
Выше from
и msg
являютсяnamed
параметры, say
которые необходимо использовать при вызове метода say(from: "xx", msg: "xx")
. Ключи не могут отсутствовать.
Однако если вы используете позиционные параметры, вы свободны.
Named
параметры называются так, потому что вы можете идентифицировать их по имени, а не по положению (если вы измените положение двух именованных параметров, это не имеет значения). См. Ответ выше от Саваранараджи
Позиционные параметры:
Они такие же, как параметры по умолчанию. Например:
void add(int x, [int y = 3]);
Здесь y имеет значение по умолчанию 3
Именованные параметры:
Это параметры, которые можно передавать в любом порядке, передав имя параметра, за которым следует переданное значение. Например:
void sum({int num1, int num2});
Эта функция называется так:
sum(num1: 12, num2: 24);
Также именованные параметры могут иметь значения по умолчанию.