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]) {
// ...
}
Необязательные параметры являются позиционными в том numRetries
что вы не можете опустить 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!
}
Если параметр функции указан с использованием синтаксиса "paramName: value", то это именованный параметр. Такие параметры можно сделать необязательными, заключив их в квадратные скобки [и]. Элементарная демонстрация этой функции может быть продемонстрирована в следующей программе Hello World:
sayHello([String name = ' World!']) {
print('Hello, ${name}');
}
void main() {
sayHello('Govind');
}
В 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
Из документа мы получаем, что positional
и named
параметры являются необязательными, что означает, что все они могут отсутствовать.
На мой взгляд, named
параметры более строгие, чем positional
. Например, если вы объявите такой метод:
String say({String from, String msg})
Выше from
и msg
являются named
параметрами, когда вы вызываете метод say
вы должны использовать say(from: "xx", msg: "xx")
. Ключи не могут отсутствовать.
Однако, если вы используете позиционные параметры, вы свободны.