Ответ
В 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 — друг программиста, но друг, который требует чёткости. Сказал «А» — будь добр говорить только буквы, а не цифры.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶