Яка різниця між названими та позиційними параметрами в Дарт?


146

Dart підтримує як названі необов'язкові параметри, так і додаткові додаткові параметри. Які відмінності між ними?

Крім того, як можна визначити, чи був необов’язковий параметр фактично вказаний?

Відповіді:


272

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
? Оператор застарів. У підручнику про дартс я виявив лише шкала == нульова умова. (expr1? expr2: expr3 досі працює)
Zdeněk Mlčoch

1
Полюбляючи кілька названих парамів для функції, це було важко знайти! Чи буде ще краще виглядати в конструкторах частина документів? ;)
побажатимуть

1
Значення за замовчуванням тепер слід задавати =замість :, відповідно до dartlang.org/guides/language/… .
nbro

31

У 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

дякуємо за чітке пояснення, надане з цього відеопосилання, кредити для творця відео.

відео посилання: Необов’язковіПозиційніПараметри

посилання на відео: Необов’язковіNamedParameters

посилання на відео: Необов’язкові параметри за замовчуванням


3

Коли параметр функції задається за допомогою синтаксису "paramName: value", то це іменований параметр. Такі параметри можна зробити необов'язковими, уклавши їх між [і] дужками. Рудиментарна демонстрація цієї функції може бути продемонстрована в наступній програмі Hello World:

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

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

2

Від doc ми отримуємо, що обидва positionalта namedпараметри необов’язкові, це означає, що всі вони можуть бути відсутніми.

На мою думку, namedпараметри суворіші за параметри positional. Наприклад, якщо ви заявляєте про такий спосіб:

String say({String from, String msg})

Вище fromі msgє namedпараметрами, коли ви викликаєте метод, який sayви повинні використовувати say(from: "xx", msg: "xx"). Ключі не можуть бути відсутніми.

Однак якщо ви використовуєте позиційні параметри, ви вільні.


Документ каже:> Необов’язкові параметри можуть бути іменними, або позиційними, але не обидва. Де сказано, що позиційні параметри необов’язкові?
Маркон

Позиційний параметр - це стиль за замовчуванням параметрів у мовах програмування, який називається позиційним, оскільки "це перший параметр, або другий тощо". Namedпараметри називаються так, тому що ви можете насправді їх ідентифікувати за назвою, а не за позицією (якщо ви переключите положення двох названих парам, це не має значення). Дивіться відповідь вище від Savaranaraja
Markon

0

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

Вони такі ж, як і параметри за замовчуванням. Наприклад:

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

Тут y має значення за замовчуванням 3

Названі параметри:

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

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

Ця функція називається так:

sum(num1: 12, num2: 24);

Також названі параметри також можуть мати значення за замовчуванням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.