Функции и методы классов :: Cетевой уголок Majestio

Функции и методы классов


В данном разделе будут рассмотрены функции. Методы будут раccмотрены только в теме объявлений входных аргументов.

Входные аргументы функции Dart подразделяются на:

  • позиционные
  • именованные
  • необязательные позиционные
  • необязательные именованные
  • комбинация из вышеперечисленных

Позиционные аргументы

Самыми простыми в понимании являются позиционное аргументы, так как последовательность передаваемых на вход функций переменных, должна соответствовать последовательности и типу объявленных в функции аргументов:

void myFunction(String name, int date, String monthName) {
  print('$name родился $date $monthName!');
}

void main(List<String> arguments) {
  myFunction('Александр', 10, 'сентября');
}

// будет напечатано: Александр родился 10 сентября!

Именованные аргументы

Для объявления того, что на вход функции аргументы передаются именованным образом необходимо обернуть их в фигурные скобки «{ }». После чего, в момент вызова функции явно указать какому именованному аргументу какое значение передается. Если тип объявляемого аргумента null-safety, т.е. не может хранить значение null, то перед объявляемым аргументом используйте ключевое слово required.

Если же значение передаваемого аргумента может хранить значение null, то после указания его типа нужно добавить символ ? и предусмотреть проверку на null, который может передаться в двух случаях:

  1. аргументу функции передали переменную, хранящую значение null
  2. именованному аргументу ничего не передавали, вследствие чего значениеаргумента по умолчанию становится равным null
void myFunction({
  String? name,
  required int date,
  required String monthName,
}) {
  if (name != null) { 
    return '$name родился $date $monthName!'; 
  } 
  return 'Не установлено имя новорожденного!';
}

void main(List<String> arguments) {
  myFunction(date: 10, name: 'Александр', monthName: 'сентября',);
  myFunction(date: 10, monthName: 'сентября',);
}

// будет напечатано: Александр родился 10 сентября!
// будет напечатано: Не установлено имя новорожденного!

Значения могут передаваться в произвольной последовательности, так как мы явно указываем какому из аргументов функции будет соответствовать то или иное значение.

Когда мы указываем, что именованный аргумент может принимать значение null, он становится необязательным при вызове функции. Но когда, кровь из носу, запрещено давать такие вольности разработчику, который будет использовать ваш код – нужно пометить такой именованный аргумент, как required. Тогда у него не останется вариантов, кроме как самому передать такому именованному аргументу вызываемой функции null.

Необязательные позиционные аргументы

Для того, чтобы указать необязательные аргументы при их позиционном размещении, нужно обернуть их в квадратные скобки [ ]:

String myFunction(String name, int date, [String? monthName]) {
  if (monthName != null) {
    return '$name родился $date $monthName!';
  }
  return '$date числа, неустановленного месяца, родился $name!';
}

void main(List<String> arguments) {
  print(myFunction('Александр', 20));
  print(myFunction('Александр', 20, 'мая'));
} 
// будет напечатано: 20 числа неустановленного месяца родился Александр!
// будет напечатано: Александр родился 20 мая!

Необязательные аргументы функции по умолчанию

Когда мы объявляем необязательные позиционные или именованные аргументы, они по умолчанию инициализируются значением null (когда при вызове функции им не задается отличное от null значение). Для того, чтобы присвоим им значение по умолчанию, отличное от null, после объявления имени аргумента нужно добавить оператор присваивание и само значение, которое будет использоваться в коде функции всякий раз, пока явно не передастся другое значение. При этом не имеет значения, тип объявляемого аргумента – null-safety или нет:

String myFunction(
  String name, [
  int? date = 10,
  String monthName = 'июля',
]) {
  return '$name родился $date $monthName!';
}

void main(List<String> arguments) {
  print(myFunction('Александр'));
  print(myFunction('Александр', 24));
  print(myFunction('Александр', 20, 'мая'));
} 
// будет напечатано: Александр родился 10 июля! 
// будет напечатано: Александр родился 24 июля! 
// будет напечатано: Александр родился 20 мая!

Чтобы ввести значение по умолчанию для именованных аргументов, достаточно просто присвоить ему значение и не использовать ключевое слово required. К расположению значений по умолчанию для такого типа аргументов требований нет, но лучше придерживаться устоявшейся традиции и объявлять их в конце:

String myFunction({
  required String name,
  required String monthName,
  int date = 10,
}) {
  return '$name родился $date $monthName!';
}

void main(List<String> arguments) {
  print(myFunction(name: 'Александр', monthName: 'мая'));
  print(myFunction(
    date: 14,
    name: 'Александр',
    monthName: 'мая',
  ));
} 
// будет напечатано: Александр родился 10 мая! 
// будет напечатано: Александр родился 14 мая!
Рейтинг: 0/5 - 0 голосов