Основная стандартная библиотека dart:core

Библиотека dart:core — основная стандартная библиотека Dart, импортируется неявно и автоматически. Она предоставляет базовые фундаментальные возможности языка. Ниже рассмотрены её основные функции и примеры кода, сгруппированные по модулям.

Разработчику не нужно прописывать инструкцию импорта; эта библиотека загружается автоматически по умолчанию.

I. Вывод в консоль

Верхнеуровневая функция print(): автоматически вызывает метод toString() объекта для вывода текстовых данных.

void main() {
  var tea = "milk tea";
  print(tea);
  print('I drink $tea.');
}Code language: Dart (dart)

II. Числовые типы: num / int / double

  1. Иерархия наследования: int и double наследуются от num
  2. Преобразование строки в число: parse(); int поддерживает параметр radix для указания системы счисления
  3. Преобразование числа в строку:
  • toString(): базовое преобразование
  • toStringAsFixed(n): сохраняет n знаков после запятой
  • toStringAsPrecision(n): n значащих цифр
void main() {
  // Преобразование строки в число
  assert(int.parse('42') == 42);
  assert(int.parse('42', radix:16) == 66);
  assert(double.parse('0.5') == 0.5);

  // Преобразование числа в строку
  assert(123.456.toStringAsFixed(2) == '123.46');
  assert(123.456.toStringAsPrecision(2) == '1.2e+2');
}

III. Строки String & Регулярные выражения RegExp

  • Объекты String неизменяемы (все методы изменения возвращают новые строки); хранят кодовые единицы UTF-16
  • Распространённые методы: поиск, выделение подстроки, разделение, изменение регистра, удаление пробелов
void main() {
  var str = 'Never odd or even';
  // Проверки
  assert(str.contains('odd'));
  assert(str.startsWith('Never'));
  assert(str.endsWith('even'));
  assert(str.indexOf('odd') == 6);

  // Подстрока и разделение
  assert(str.substring(6,9) == 'odd');
  var parts = 'a b c'.split(' ');

  // Удаление пробелов и проверка на пустоту
  assert('  abc  '.trim() == 'abc');
  assert(''.isEmpty);
  assert('  '.isNotEmpty);

  // Перевод в верхний регистр
  assert('dart'.toUpperCase() == 'DART');

  // Для конкатенации используйте StringBuffer (лучшая производительность)
  var sb = StringBuffer();
  sb.write('Hello ');
  sb.writeAll(['A','B','C'], ',');
  print(sb.toString());
}

Регулярные выражения RegExp

void main() {
  var reg = RegExp(r'\d+'); // Ищет последовательности цифр
  var text = 'llamas live 15 to 20 years';

  assert(reg.hasMatch(text));
  // Перебор всех глобальных совпадений
  for(var m in reg.allMatches(text)){
    print(m.group(0));
  }
  // Замена совпавших фрагментов
  var res = text.replaceAll(reg, 'XX');
  print(res);
}

Примечание: Кодовая единица не всегда соответствует видимому символу. Для сложных символов Unicode (комбинации эмодзи) используйте внешний пакет characters.

IV. Коллекции (List / Set / Map)

1. List: упорядоченный, допускает дубликаты, доступ по индексу

void main() {
  var fruits = ['apple','orange'];
  fruits.add('kiwi');
  fruits.addAll(['grape']);
  fruits.removeAt(0);
  fruits.sort((a,b)=>a.compareTo(b)); // Сортировка элементов

  // Ограничение по типу
  var strList = <String>[];
}

2. Set: неупорядоченный, уникальные элементы, доступ по индексу отсутствует

void main() {
  var set = <String>{};
  set.addAll(['gold','xenon']);
  set.add('gold'); // Повторное добавление не даёт эффекта
  assert(set.contains('xenon'));

  // Операция пересечения множеств
  var set2 = Set.from(['xenon','argon']);
  var inter = set.intersection(set2);
}

3. Map: коллекция пар «ключ–значение»; ключи уникальны

void main() {
  var map = {54: 'xenon'};
  print(map[54]);
  assert(map.containsKey(54));
  map.remove(54);

  // Задать значение только при отсутствии ключа
  map.putIfAbsent('name', () => 'Dart');

  // Обход записей
  map.forEach((k,v)=>print('$k:$v'));
}

4. Универсальные операции Iterable (List и Set реализуют Iterable)

Часто используемые высшего порядка: forEach, map, where, any, every

void main() {
  var list = ['green','black','chamomile'];
  list.forEach(print);

  // map вычисляется лениво; toList запускает расчёт немедленно
  var upperList = list.map((e)=>e.toUpperCase()).toList();

  // Фильтрация элементов
  var filter = list.where((e)=>e == 'chamomile');
  assert(list.any((e)=>e == 'chamomile'));
  assert(!list.every((e)=>e.contains('tea')));
}

V. Работа с URI (Uri)

Используется для кодирования, декодирования, разбора и построения URL

  1. encodeFull: кодирует только пробелы и похожие символы, сохраняет служебные символы URL / : ? &
  2. encodeComponent: экранирует все специальные символы (подходит для кодирования значений параметров)
void main() {
  // Разбор ссылки
  var uri = Uri.parse('https://example.org:8080/foo?lang=dart#frag');
  print(uri.scheme);
  print(uri.host);
  print(uri.queryParameters);

  // Построение ссылки
  var newUri = Uri.https('example.org','/foo', {'lang':'dart'});
}

VI. Дата и время DateTime & Duration

  • DateTime: момент времени, поддерживает локальное время и UTC
  • Duration: временной интервал, используется для сложения/вычитания моментов и расчёта разницы
void main() {
  var now = DateTime.now();
  var y2k = DateTime.utc(2000);

  // Сложение и вычитание времени
  var nextYear = y2k.add(const Duration(days:366));
  var diff = nextYear.difference(y2k);
  print(diff.inDays);

  // Метка времени (миллисекунды с эпохи Unix 1970-01-01 UTC)
  print(y2k.millisecondsSinceEpoch);
}

Важно: Сдвиги по дням могут приводить к ошибкам при переходе на летнее время. Рекомендуется использовать UTC.

VII. Полезные интерфейсы и базовые классы

1. Comparable: позволяет сравнивать объекты для сортировки

class Line implements Comparable<Line> {
  final int length;
  const Line(this.length);
  @override
  int compareTo(Line other) => length - other.length;
}

2. Пользовательские ключи для Map: переопределите == и hashCode

Правило: Равные объекты должны иметь одинаковый hashCode

class Person {
  final String first, last;
  Person(this.first,this.last);

  @override
  int get hashCode => Object.hash(first, last);

  @override
  bool operator ==(Object other) =>
      other is Person && other.first == first && other.last == other.last;
}
  • 3. Iterable + Iterator

Реализация Iterable даёт возможность использовать циклы for-in с кастомной логикой обхода.

VIII. Обработка исключений

  • Error: критический сбой, как правило, не перехватывается (пример: NoSuchMethodError)
  • Exception: предсказуемая аномалия, которую можно перехватить; поддерживается создание собственных исключений
class FooException implements Exception {
  final String? msg;
  const FooException([this.msg]);
  @override
  String toString() => msg ?? 'FooException';
}

IX. Слабые ссылки и финализаторы

  • WeakReference: слабая ссылка, не препятствует сборщику мусора освободить целевой объект
  • Finalizer / NativeFinalizer: запускает обратный вызов при сборке объекта для освобождения нативных ресурсов
  • Finalizable: предотвращает преждевременную очистку объекта сборщиком мусора

Основная стандартная библиотека dart:core

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *