betacode

Функции в Dart

  1. Что такое функция?
  2. Регулярная функция
  3. Closure (Закрытая сумка)
  4. Опциальный параметр
  5. Опциональные именованный параметр

1. Что такое функция?

В языке программирования Dart, функция (function) представляет собой именованный блок кода (block of code), который может принимать параметры и возвращать значение или возвращать значение и запускаться только при вызове. Функции разделяют большие задачи на мелкие части и выполняют определенные операции этой программы. Этот процесс повышает возможность повторного использования кода и расширяет модульный подход программы.
return_type function_name(arguments)  {
   // Statements
}
Примечание: Как и в JavaScript, Dart не допускает двух функций с одинаковым именем, даже если они имеют разные параметры.

2. Регулярная функция

Синтаксис для объявления обычной функции:
return_type function_name(data_type1 arg1, data_type2 arg2, data_typeN argN)  {
   // Statements
}
Используйте ключевое слово void (или пустой) в качестве типа возвращаемого значения, если функция ничего не возвращает.
void function_name(data_type1 arg1, data_type2 arg2, data_typeN argN)  {
   // Statements
}
// Same as:
function_name(data_type1 arg1, data_type2 arg2, data_typeN argN)  {
   // Statements
}
Например: Функция sum принимает два аргумента типа int и возвращает значение типа int.
function_ex1.dart
int sum(int a, int b)  {
  return a + b;
}
void main()  {
   var result  = sum(100, 200); // 300
   print('result = $result');  
}
Например: Функция greeting принимает параметр типа String и ничего не возвращает.
function_ex2.dart
void greeting(String name)  {
   var s = 'Hello $name';
   print(s);
}
void main()  {
   // Call the function:
   greeting('Tom'); // Hello Tom
}

3. Closure (Закрытая сумка)

В языке программирования Dart, Closure (Закрытая сумка) - это специальная функция.
  • Подобно функции, Closure представляет собой блок операторов с параметрами и может возвращать значение или ничего.
  • В отличие от функции, closure не имеет имени. Однако вы можете идентифицировать его с помощью переменной.
Смотрите подробную статью о Closure:

4. Опциальный параметр

Как упоминалось выше, Dart не допускает функций с одинаковым именем, но функция может включать опциональные параметры, которые должны быть последними параметрами в списке параметров.
Синтаксис:
return_type function_name(typeM argM, typeN argN, [typeP? argP, typeQ? argQ]) {  
     // statement(s)  
}
Или синтаксис - Опциональный параметр со значением по умолчанию:
return_type function_name(typeM argM, typeN argN,
                          [typeP? argP = defaultValueP, typeQ? argQ]) {  
     // statement(s)  
}
Например:
function_optional_args_ex1.dart
String concat(String s1, String s2, [String? s3]) {
  if (s3 != null) {
    return s1 + s2 + s3;
  }
  return s1 + s2;
}
double sum(double v1, double v2, [double? v3, double? v4]) {
  return v1 + v2 + (v3 ?? 0) + (v4 ?? 0);
}
void main() {
  String result1 =  concat('One', 'Two');
  print('result1: $result1');
  String result2 =  concat('One', 'Two', 'Three');
  print('result2: $result2');
 
  double value1 =  sum(1, 2, 3, 4);
  print('value1: $value1');
  double value2 = sum(1, 2, 3);
  print('value2: $value2');
  double value3 = sum(1, 2);
  print('value3: $value3');
}
Output:
result1: OneTwo
result2: OneTwoThree
value1: 10.0
value2: 6.0
value3: 3.0

5. Опциональные именованный параметр

Опциальные именованные параметры (Optional Named Parameters) - это параметры, заключенные в фигурные скобки {} и помещенные в конец списка параметров функции. Все эти параметры имеют значения по умолчанию.
Синтаксис:
return_type function_name(typeM argM, typeN argN,
                                   {typeP argP = defaultValueP, typeQ argQ = defaultValueQ}){  
     // statement(s)  
}
Например:
function_optional_named_args_ex1.dart
String concatAndTrim(String s1, String s2, {bool trimLeft = true, bool trimRight = true}) {
  var s = s1 + s2;
  if (trimLeft && trimRight) {
    return s.trim();
  } else if (trimLeft) {
    return s.trimLeft();
  } else if (trimRight) {
    return s.trimRight();
  }
  return s;
}
void main() {
  var s1 = '  One  ';
  var s2 = '  Two  ';

  var result1 = concatAndTrim(s1, s2); // trim left and right
  print('result1: -->$result1<-- (Trim left and right)');

  var result2 = concatAndTrim(s1, s2, trimLeft: false); // trim right only
  print('result2: -->$result2<-- (Trim right only)');

  var result3 = concatAndTrim(s1, s2, trimRight: false); // trim left only
  print('result3: -->$result3<-- (Trim left only)' );

  var result4 =
      concatAndTrim(s1, s2, trimLeft: false, trimRight: false); // no trim
  print('result4: -->$result4<!-- (No Trim)');
}
Output:
result1: -->One    Two<-- (Trim left and right)
result2: -->  One    Two<-- (Trim right only)
result3: -->One    Two  <-- (Trim left only)
result4: -->  One    Two  <!-- (No Trim)