Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Дарт имеет два типа необязательных параметров: именованные и позиционные. Прежде чем обсуждать различия, позвольте мне сначала обсудить сходства.

Необязательные параметры 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!
}

Ответ 2

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

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

void main() {
  sayHello('Govind');
}

Ответ 3

В 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

Ответ 4

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

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

String say({String from, String msg})

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

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