Что такое ключевое слово var в Dart?

Ответ

В Dart var — это ключевое слово для объявления переменной с выводом типа. Компилятор автоматически определяет тип переменной на основе значения, присвоенного при инициализации, и затем фиксирует его.

Как это работает:

var name = 'Алиса'; // Компилятор выводит тип `String`
var count = 42;     // Компилятор выводит тип `int`
var list = [];      // Компилятор выводит тип `List<dynamic>`
var typedList = <String>[]; // Компилятор выводит тип `List<String>`

Важные особенности:

  • Тип фиксируется один раз. После объявления тип изменить нельзя.
    var id = 100;
    id = 200;     // OK, значение того же типа (int)
    id = 'двести'; // ОШИБКА компиляции: тип `int` не может быть `String`
  • Требует инициализации при объявлении. Тип не может быть выведен из null.
    var value; // ОШИБКА: Нельзя вывести тип. Нужно использовать `var value = null;` (тип `dynamic`) или `dynamic value;`.

Когда использовать var:

  • Для локальных переменных, когда тип значения очевиден из контекста (например, var controller = TextEditingController();).
  • Для сокращения многословных generic-типов (например, var complexMap = <String, List<Future<MyData>>>{};).

Чем отличается от dynamic и Object?

  • var: Статический вывод типа. Безопасно, проверяется на этапе компиляции.
  • dynamic: Отключает статическую проверку типов. Тип может меняться, проверка откладывается на время выполнения.
  • Object: Переменная имеет статический тип Object. Для доступа к методам конкретного типа требуется явное приведение (as).

Ответ 18+ 🔞

А, ну вот, опять про этот var! Слушай, история как с тем самым парнем, который вроде бы нормальный, а потом раз — и оказался пидарас шерстяной. В Dart var — это как раз такая хитрая жопа. Выглядит просто, а подвох есть.

Короче, var — это не какой-то особый тип, это просто команда компилятору: «Э, бошка, думай! Посмотри, какое значение я этому чуваку присваиваю, и сам догадайся, какого он типа». И компилятор, такой довольный, говорит: «Ага, понял!» И намертво приклеивает к переменной этот самый выведенный тип.

Вот смотри, как это выглядит в жизни:

var имя = 'Вася'; // Компилятор посмотрел на 'Вася' и сказал: «О, String! Запомнил».
var число = 100500; // Увидел цифры — сразу: «int, ёпта!»
var пустойСписок = []; // Тут он немного офигел и выдал `List<dynamic>`, типа «хуй его знает, что ты туда потом напихаешь».
var списокСтрок = <String>[]; // А тут ты ему помог, и он уверенно сказал: «List<String>, ясен хуй».

И вот тут главный подвох, из-за которого доверия ебать ноль у новичков: тип фиксируется навсегда. Это как татуха на жопе в 18 лет — потом хоть умри, но «Любаша» с сердечком никуда не денется.

var id = 100;
id = 200;     // Нормально, всё ещё циферки.
id = 'двести'; // БАБАХ! ОШИБКА! Компилятор орёт: «Я тебе определил `int`, а ты мне `String` суёшь! Иди ты нахуй!» Тип изменить нельзя.

И второй важный момент: var — это не волшебная палочка. Он не может вывести тип из пустоты. Ему нужно сразу дать значение, чтобы было с чего списывать.

var значение; // ОШИБКА! Компилятор в ступоре: «Чё это? Воздух? Мне с чего тип выводить, ёб твою мать?»
// Надо либо сразу присвоить null (тогда тип будет `dynamic`), либо явно использовать `dynamic`.

Так когда его юзать, этот var?

  • Когда и так всё ясно. Ну правда, писать TextEditingController controller = TextEditingController(); — это пиздец как много букв. var controller = TextEditingController(); — и всем сразу понятно.
  • Когда тип длиннее, чем «Война и мир». Вот смотри: Map<String, List<Future<MyData>>> map = <String, List<Future<MyData>>>{};. Овердохуища символов! А можно просто var map = <String, List<Future<MyData>>>{};. Красота!

И главное — не путай с dynamic и Object!

  • var — это умный и безопасный. Тип вывелся, зафиксировался, и всё проверяется при компиляции. Как швейцарские часы.
  • dynamic — это похуй, понтуйся сам. «Я не знаю, что это, и знать не хочу. Разберёшься в процессе». Проверка типов — только когда программа уже бежит. Очень легко получить NoSuchMethodError прямо в лоб во время выполнения.
  • Object — это формалист. «У этой переменной тип — Object, и точка». Чтобы что-то с ней сделать, нужно кастовать (as). Безопасно, но муторно.

Короче, var — друг программиста, но друг, который требует чёткости. Сказал «А» — будь добр говорить только буквы, а не цифры.