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
ссылка на видео: OptionalNamedParameters
ссылка на видео: OptionalDefaultParameters
источник
Когда параметр функции указывается с использованием синтаксиса 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);
Также именованные параметры могут иметь значения по умолчанию.
источник