В чем разница между именованными и позиционными параметрами в Dart?

161

Dart поддерживает как именованные необязательные параметры, так и позиционные необязательные параметры. В чем разница между ними?

Кроме того, как узнать, действительно ли указан необязательный параметр?

Сет Лэдд
источник

Ответы:

300

У 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!
}
Сет Лэдд
источник
4
? оператор устарел. В учебнике по дартсу я нашел только условие scale == null. (expr1? expr2: expr3 все еще работает)
Зденек Млчоч
1
Люблю несколько именованных параметров для функции, это было трудно найти! Будет ли еще лучше смотреться в части документации, посвященной конструкторам? ;)
Will Squire
1
Значения по умолчанию теперь следует указывать с помощью =вместо :, согласно dartlang.org/guides/language/… .
nbro
Почему нельзя использовать как позиционные необязательные параметры, так и именованные необязательные параметры.
Дунхуа Лю,
Исторически, какой из них был впервые реализован Dart Team, «позиционные» или «именованные» необязательные параметры? Моя гипотеза: первая реализованная - это позиционные необязательные параметры.
Программист, ориентированный на деньги,
35

В 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

Саравана Раджа
источник
Это такой ясный ответ, большое спасибо
Сана Аль-Ахдал
3

Когда параметр функции указывается с использованием синтаксиса paramName: value, это именованный параметр. Такие параметры можно сделать необязательными, заключив их в квадратные скобки [и]. Элементарную демонстрацию этой функции можно продемонстрировать в следующей программе Hello World:

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

void main() {
  sayHello('Govind');
}
Балепур
источник
1

Из дока мы получаем , что оба positionalи namedпараметры не являются обязательными, что означает , что все они могут отсутствовать.

На мой взгляд, namedпараметры строже, чемpositional . Например, если вы объявите такой метод:

String say({String from, String msg})

Выше fromи msgявляютсяnamed параметры, sayкоторые необходимо использовать при вызове метода say(from: "xx", msg: "xx"). Ключи не могут отсутствовать.

Однако если вы используете позиционные параметры, вы свободны.

CoXier
источник
В документе говорится:> Необязательные параметры могут быть именованными или позиционными, но не обоими сразу. Где сказано, что позиционные параметры необязательны?
Markon
Позиционный параметр - это стиль параметров по умолчанию в языках программирования, который называется позиционным, потому что «это первый параметр или второй и т. Д.». Namedпараметры называются так, потому что вы можете идентифицировать их по имени, а не по положению (если вы измените положение двух именованных параметров, это не имеет значения). См. Ответ выше от Саваранараджи
Маркон
0

Позиционные параметры:

Они такие же, как параметры по умолчанию. Например:

void add(int x, [int y = 3]);

Здесь y имеет значение по умолчанию 3

Именованные параметры:

Это параметры, которые можно передавать в любом порядке, передав имя параметра, за которым следует переданное значение. Например:

void sum({int num1, int num2});

Эта функция называется так:

sum(num1: 12, num2: 24);

Также именованные параметры могут иметь значения по умолчанию.

Зохаиб Хамдуле
источник