Dart: Синтаксис и Основа

Погрузитесь в основные концепции программирования на Dart с этим полным руководством. Охватывая важные темы, такие как синтаксис, типы переменных, функции, циклы и управление потоком, статья предлагает глубокое понимание основ Dart. Идеально подходит для начинающих и закладывает основу для освоения Dart, от простых типов данных до сложных функций, обеспечивая прочную основу в этом универсальном и мощном языке программирования.

Dec 28, 2023

Введение

Добро пожаловать в мир Dart, современного языка программирования, разработанного для удобства использования и высокой производительности. Независимо от того, хотите ли вы разрабатывать мобильные приложения с Flutter или исследовать веб- и серверную разработку, изучение Dart станет вашим первым шагом. В этой статье мы рассмотрим основной синтаксис и фундаментальные концепции Dart, заложив прочную основу для вашего пути в программировании.

Основной Синтаксис

Программа Hello World на Dart
Почти каждое путешествие в программирование часто начинается с программы 'Hello World'. Вот как это выглядит на Dart:
void main() { print('Hello, World!'); }
Эта программа определяет функцию main, которая является точкой входа в любое приложение Dart. Функция print выводит строку 'Hello, World!' в консоль.
Переменные и Типы Данных
  1. Основное Объявление и Инициализация
    1. В Dart переменные можно объявлять, используя явные аннотации типов или ключевое слово var для вывода типов.
      • Аннотация Типа:
        • String name = 'Alice'; int age = 30;
      • Вывод Типов с var:
        • var city = 'New York'; // Определяется как String var distance = 100; // Определяется как int
  1. Final, Const и Late
    1. Dart предоставляет ключевые слова final, const и late для особых объявлений переменных.
      • final: Для значений, которые устанавливаются один раз и неизменны.
        • final String greeting = 'Hello';
      • const: Объявляет константы времени компиляции.
        • const double pi = 3.14159;
      • late: Указывает на отложенную инициализацию.
        • late String description; // Может быть переназначена late final int calculatedValue; // Один раз установленное значение late String? nullOrStringValue; // Должно быть либо null, либо значением String
      • dynamic vs var:
        • Dart предлагает два динамических типа: dynamic и var. Разница заключается в проверке типов:
        • dynamic: Явно отключает статическую проверку типов. Тип может изменяться со временем.
          • dynamic variable = 'Hello'; variable = 100; // Разрешено
        • var: Поддерживает статическую проверку типов. Как только тип установлен, он не может измениться.
          • var variable = 'Hello'; // variable = 100; // Ошибка: тип 'int' не может быть присвоен типу 'String'

Типы Данных в Dart

  1. Числа
      • int: Представляет целые числа.
        • int population = 150000;
      • double: Обрабатывает числа с плавающей точкой.
        • double price = 99.99;
  1. Строки
    1. Строки в Dart представляют собой последовательности символов в кодировке UTF-16.
      String fullName = 'John Doe'; String multiline = ''' Это многострочная строка. ''';
      Интерполяция строк:
      String greeting = "Привет, $fullName!";
  1. Логические Значения
    1. Тип bool представляет логические значения true или false.
      bool isVisible = false; bool isEligible = age > 18;
 

Циклы в Dart

  1. Цикл While
      • Выполняется, пока условие истинно.
        • int count = 0; while (count < 5) { print('Счетчик: $count'); count++; }
  1. Цикл Do-While
      • Выполняет блок кода один раз перед проверкой условия.
        • int counter = 0; do { print('Счетчик: $counter'); counter++; } while (counter < 5);
  1. Break и Continue
      • Break: Немедленно выходит из цикла.
        • for (int i = 0; i < 10; i++) { if (i == 5) break; // Выход из цикла, когда i равно 5 print(i); }
      • Continue: Пропускает остальную часть текущей итерации цикла.
        • for (int i = 0; i < 10; i++) { if (i % 2 == 0) continue; // Пропускает четные числа print('Нечетное: $i'); }

Логические Операторы

  1. Простое Условие If
      • Выполняет блок кода, если условие истинно.
        • int age = 20; if (age >= 18) { print('Взрослый'); }
  1. Условие If-Else
      • Предоставляет альтернативный путь, если условие if ложно.
        • if (age >= 18) { print('Взрослый'); } else { print('Несовершеннолетний'); }
  1. Лестница If-Else-If
      • Последовательная проверка нескольких условий.
        • if (age >= 18) { print('Взрослый'); } else if (age >= 13) { print('Подросток'); } else { print('Ребенок'); }
  1. Вложенные Условия If
      • Условия If внутри других условий If.
        • bool hasDrivingLicense = true; if (age >= 18) { if (hasDrivingLicense) { print('Может водить'); } else { print('Не может водить без лицензии'); } }
  1. Условный (Тернарный) Оператор
      • Краткий способ записи простых условий if-else.
        • String type = age >= 18 ? 'Взрослый' : 'Несовершеннолетний';
  1. Оператор Switch Case
      • Используется для выбора одного из множества блоков кода для выполнения.
        • String grade = 'A'; switch (grade) { case 'A': print('Отлично'); break; case 'B': print('Хорошо'); break; default: print('Неверная оценка'); }

Определение Функций

  1. Типы Возврата
      • Функции могут возвращать значения. Тип возвращаемого значения указывается перед именем функции.
        • int add(int a, int b) { return a + b; }
      • Если функция не возвращает значение, ее тип возвращаемого значения - void.
  1. Необязательные Параметры
      • Dart поддерживает необязательные позиционные и именованные параметры.
        • Позиционные: Заключаются в квадратные скобки [].
          • void sayMessage(String message, [String? author]) { print('$message от ${author ?? 'Аноним'}'); }
        • Именованные: Заключаются в фигурные скобки {} и часто используются с значениями по умолчанию.
          • void setSettings({bool bold = false, bool hidden = false}) { // Тело функции }
  1. Функции-Стрелки
      • Подходят для функций с одним выражением.
        • void greet(String name) => print('Привет, $name!');
  1. Анонимные Функции
      • Часто используются в коллекциях или как аргументы функций высшего порядка.
        • var numbers = [1, 2, 3]; numbers.forEach((number) { print(number); });

Расширенные Концепции Функций

  1. Функции Высшего Порядка
      • Функции, которые могут принимать другие функции в качестве параметров или возвращать функцию.
        • void executeFunction(Function callback) { callback(); }
  1. Функции как Объекты Первого Класса
      • Функции могут быть назначены переменным и переданы в качестве параметров.
        • var multiply = (int a, int b) => a * b; int result = multiply(10, 2);
  1. Замыкания
      • Функции, которые могут получать доступ и изменять переменные из своего лексического контекста.
        • Function makeAdder(int addBy) { return (int i) => addBy + i; } var adder = makeAdder(5); print(adder(3)); // Выводит 8
  1. Генераторы
      • Функции, производящие последовательности значений с использованием yield и yield*.
        • Iterable<int> count(int max) sync* { for (int i = 0; i < max; i++) { yield i; } }
  1. Асинхронные Функции
      • Функции, обрабатывающие асинхронные операции, возвращают Future или Stream.
        • Future<void> fetchData() async { // Асинхронные операции }
  1. Методы Расширения
      • Позволяют добавлять новые функциональности к существующим классам.
        • extension StringExtension on String { bool get isCapitalized => this.length > 0 && this[0].toUpperCase() == this[0]; }

Параметры Функций и Значения По Умолчанию

  1. Значения Параметров По Умолчанию
      • Установка значений по умолчанию для параметров, как позиционных, так и именованных.
        • void printMessage(String message, {int times = 1}) { for (int i = 0; i < times; i++) { print(message); } }
  1. Обязательные Именованные Параметры
      • Сделать именованный параметр обязательным, используя ключевое слово required.
        • void setAddress({required String street, String? city}) { // Тело функции }

Заключение

Этот обзор вводит вас в основы программирования на Dart. Вы узнали, как написать простую программу на Dart, объявить переменные, использовать управляющие операторы, определить функции и обработать ошибки. По мере вашего прогресса эти концепции станут кирпичиками для более сложных и захватывающих приложений Dart.
Оставайтесь с нами, в следующей статье мы углубимся в мир Dart!