Вот пример создания переменной и ее инициализации:
var name = 'Bob';
Переменные хранят ссылки. Переменная с именем name
содержит ссылку на объект String
со значением «Bob»
.
Тип переменной name
выводится как String
, но вы можете изменить этот тип, указав его. Если объект не ограничен одним типом, укажите объект Object
или динамический тип dynamic
, следуя рекомендациям по проектированию.
dynamic name = 'Bob';
Другой вариант — явно объявить тип, который будет выведен:
String name = 'Bob';
Значение по умолчанию
Неинициализированные переменные имеют начальное значение null
. Даже переменные с числовыми типами изначально равны нулю, потому что числа — как и все остальное в Dart — являются объектами.
int lineCount;
assert(lineCount == null);
Данные final и const
Если вы никогда не собираетесь менять переменную, используйте final
или const
, либо вместо var
, либо в дополнение к типу. Окончательная переменная может быть установлена только один раз; константная переменная — это константа времени компиляции. (Константные переменные неявно являются окончательными.) Последняя переменная верхнего уровня или класса инициализируется при первом использовании.
final
, но не const
. Переменные final
экземпляра должны быть инициализированы до запуска тела конструктора — при объявлении переменной, параметром конструктора или в списке инициализатора конструктора. Вот пример создания и установки окончательной переменной:
final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';
Вы не можете изменить значение окончательной переменной:
name = 'Alice'; // Error: a final variable can only be set once.
Используйте const
для переменных, которые вы хотите быть константами во время компиляции. Если переменная const
находится на уровне класса, пометьте ее как static const
. Когда вы объявляете переменную, присвойте ей значение постоянной времени компиляции, такой как числовой или строковый литерал, константная переменная или результат арифметической операции с постоянными числами:
const bar = 1000000; // Unit of pressure (dynes/cm2)
const double atm = 1.01325 * bar; // Standard atmosphere
Ключевое слово const предназначено не только для объявления константных переменных. Вы также можете использовать его для создания постоянных значений, а также для объявления конструкторов, которые создают постоянные значения. Любая переменная может иметь постоянное значение.
var foo = const [];
final bar = const [];
const baz = []; // Equivalent to `const []`
Вы можете опустить const
из инициализирующего выражения объявления const
, как для baz
выше. Для получения дополнительной информации см. НЕ используйте const с избыточностью.
Вы можете изменить значение неконечной, неконстантной переменной, даже если она имела постоянное значение:
foo = [1, 2, 3]; // Was const []
Вы не можете изменить значение переменной const
:
baz = [42]; // Error: Constant variables can't be assigned a value.
Начиная с Dart 2.5, вы можете определять константы, которые используют проверку типов и приведение (is
и as
), коллекция if и коллекция for и спред — операторы распространения (...
и ...?
):
// Valid compile-time constants as of Dart 2.5.
const Object i = 3; // Where i is a const Object with an int value...
const list = [i as int]; // Use a typecast.
const map = {if (i is int) i: "int"}; // Use is and collection if.
const set = {if (list is List<int>) ...list}; // ...and a spread.
Для получения дополнительной информации об использовании const
для создания постоянных значений см. Списки(Lists), Карты(Maps) и Классы(Classes).
Встроенные типы
Язык Dart имеет специальную поддержку для следующих типов:
- numbers — числа;
- strings — строки;
- booleans — булевые значения;
- lists (also known as arrays) — списки, который также упоминаются массивами;
- sets — наборы;
- maps — карты;
- runes — нужны для выражения символов Юникода в строке;
- symbols — символы.
Вы можете инициализировать объект любого из этих специальных типов, используя литерал. Например, «это строка» — строковый литерал, true
— логический литерал.
Поскольку каждая переменная в Dart ссылается на объект — экземпляр класса — обычно вы можете использовать конструкторы для инициализации переменных. Некоторые из встроенных типов имеют свои собственные конструкторы. Например, вы можете использовать конструктор Map()
для создания карты.
Числа — Numbers
Номера дротиков бывают двух видов:
int — целочисленные значения не более 64 бит, в зависимости от платформы. На виртуальной машине Dart значения могут быть от -263 до 263 — 1. В Dart, скомпилированном в JavaScript, используются числа JavaScript, допускающие значения от -253 до 253 — 1.
doube — 64-битные (с двойной точностью) числа с плавающей точкой, как указано в стандарте IEEE 754.
И int
, и double
являются подтипами num. Тип num
включает в себя основные операторы, такие как +
, -
, /
и *
, а также, где вы найдете abs()
, ceil()
и floor()
, среди других методов. (Битовые операторы, такие как >>
, определены в классе int
.) Если num
и его подтипы не имеют того, что вы ищете, библиотека dart:math имеет.
Целые числа — это числа без десятичной точки. Вот несколько примеров определения целочисленных литералов:
var x = 1;
var hex = 0xDEADBEEF;
Если число включает в себя десятичную, это double
. Вот несколько примеров определения двойных литералов:
double z = 1; // Equivalent to double z = 1.0.
Вот как вы превращаете строку в число или наоборот:
// String to int
var one = int.parse('1');
assert(one == 1);
// String to double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);
// int to String
String oneAsString = 1.toString();
assert(oneAsString == '1');
// double to String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');
Тип int определяет традиционные побитовые операторы сдвига (<<
, >>
), AND
(&
) и OR
(|
). Например:
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;
Строки — Strings
Строка Dart представляет собой последовательность кодовых единиц UTF-16. Вы можете использовать одинарные или двойные кавычки для создания строки:
var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
var s3 = 'It\'s easy to escape the string delimiter.';
var s4 = "It's even easier to use the other delimiter.";
Вы можете поместить значение выражения в строку, используя ${expression}
. Если выражение является идентификатором, вы можете пропустить {}
. Чтобы получить строку, соответствующую объекту, Dart вызовет метод объекта toString()
.
var s = 'string interpolation';
assert('Dart has $s, which is very handy.' ==
'Dart has string interpolation, ' +
'which is very handy.');
assert('That deserves all caps. ' +
'${s.toUpperCase()} is very handy!' ==
'That deserves all caps. ' +
'STRING INTERPOLATION is very handy!');
==
проверяет, эквивалентны ли два объекта. Две строки эквивалентны, если они содержат одинаковую последовательность единиц кода. Вы можете объединять строки, используя примыкающие строковые литералы или оператор +
:
var s1 = 'String '
'concatenation'
" works even over line breaks.";
assert(s1 ==
'String concatenation works even over '
'line breaks.');
var s2 = 'The + operator ' + 'works, as well.';
assert(s2 == 'The + operator works, as well.');
Другой способ создания многострочной строки: используйте тройную кавычку с одинарными или двойными кавычками:
var s1 = '''
You can create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-line string.""";
Вы можете создать «сырую» строку, добавив к ней префикс r
:
var s = r'In a raw string, not even \n gets special treatment.';
Посмотрите Руны для деталей о том, как выразить символы Unicode в строке.
Литеральные строки являются константами времени компиляции, если любое интерполированное выражение является константой времени компиляции, которая оценивается как нулевое или числовое, строковое или логическое значение.
// These work in a const string.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';
// These do NOT work in a const string.
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];
const validConstString = '$aConstNum $aConstBool $aConstString';
// const invalidConstString = '$aNum $aBool $aString $aConstList';
Для получения дополнительной информации об использовании строк см. Строки и регулярные выражения.
Булевые значения — Booleans
Для представления логических значений Dart имеет тип с именем bool
. Только два объекта имеют тип bool: логические литералы true
и false
, которые являются константами времени компиляции.
Безопасность типов Dart означает, что вы не можете использовать код вроде if(nonbooleanValue)
или assert(nonbooleanValue)
. Вместо этого явно проверьте значения, как тут:
// Check for an empty string.
var fullName = '';
assert(fullName.isEmpty);
// Check for zero.
var hitPoints = 0;
assert(hitPoints <= 0);
// Check for null.
var unicorn;
assert(unicorn == null);
// Check for NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
Списки — Lists
Возможно, самая распространенная коллекция почти в каждом языке программирования — это массив или упорядоченная группа объектов. В Dart массивы являются объектами List, поэтому большинство людей просто называют их списками.
var list = [1, 2, 3];
List <int>
. Если вы попытаетесь добавить нецелые объекты в этот список, анализатор или среда выполнения выдаст ошибку. Для получения дополнительной информации читайте о выводе типа. Списки используют индексацию с нуля, где 0
— это индекс первого элемента, а list.length - 1
— это индекс последнего элемента. Вы можете получить длину списка и ссылаться на элементы списка так же, как в JavaScript:
var list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);
list[1] = 1;
assert(list[1] == 1);
Чтобы создать список, который является константой времени компиляции, добавьте const
перед литералом списка:
var constantList = const [1, 2, 3];
// constantList[1] = 1; // Uncommenting this causes an error.
В Dart 2.3 появился оператор распространения spread(...)
и оператор распространения с нулевым значением (...?
), Которые обеспечивают краткий способ вставки нескольких элементов в коллекцию.
Например, вы можете использовать спред — оператор распространения (...
), чтобы вставить все элементы списка в другой список:
var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);
Если выражение справа от оператора распространения может быть нулевым, вы можете избежать исключений, используя оператор распространения с нулевым значением (...?
):
var list;
var list2 = [0, ...?list];
assert(list2.length == 1);
Для получения более подробной информации и примеров использования оператора распространения, см. Предложение оператора распространения.
В Dart 2.3 также была представлена collection if
и collection for
, которые можно использовать для построения коллекций с использованием условий (if
) и повторения (for
).
Вот пример использования collection if
создания списка с тремя или четырьмя элементами в нем:
var nav = [
'Home',
'Furniture',
'Plants',
if (promoActive) 'Outlet'
];
Вот пример использования collection if
для управления элементами списка перед их добавлением в другой список:
var listOfInts = [1, 2, 3];
var listOfStrings = [
'#0',
for (var i in listOfInts) '#$i'
];
assert(listOfStrings[1] == '#1');
Дополнительные сведения и примеры использования коллекции if
и for
см. В предложении коллекции потоков управления.
Тип List
имеет много удобных методов для работы со списками. Для получения дополнительной информации о списках см. Генераторы Generics и коллекции Collections
.
Наборы — Sets
Набор в Dart — это неупорядоченная коллекция уникальных предметов. Поддержка Dart для наборов обеспечивается литералами set
и типом Set
.
Вот простой набор Dart, созданный с использованием литерала набора:
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
halogens
имеют тип Set<String>
. Если вы попытаетесь добавить неправильный тип значения в набор, анализатор или среда выполнения выдаст ошибку. Для получения дополнительной информации читайте о выводе типа. Чтобы создать пустой набор, используйте {}
с предшествующим аргументом типа или присвойте {}
переменной типа Set
:
var names = <String>{};
// Set<string> names = {}; // This works, too.
// var names = {}; // Creates a map, not a set.
Добавьте элементы в существующий набор, используя методы add()
или addAll()
:
var elements = <String>{};
elements.add('fluorine');
elements.addAll(['halogens']);
assert(elements.length == 5);
Используйте .length
, чтобы получить количество предметов в наборе:
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
assert(elements.length == 5);
Чтобы создать набор, который является константой времени компиляции, добавьте const
перед литералом набора:
final constantSet = const {
'fluorine',
'chlorine',
'bromine',
'iodine',
'astatine',
};
// constantSet.add('helium'); // Uncommenting this causes an error.
Начиная с Dart 2.3, наборы поддерживают операторы распространения (...
и ...?
) И коллекции if
и for
, как это делают списки. Для получения дополнительной информации см. Обсуждения оператора распространения списка и оператора сбора списка.
Для получения дополнительной информации о наборах см. Обобщения Generics
и наборы Sets
.
Карты — Maps
В общем, карта — это объект, который связывает ключи и значения. И ключи, и значения могут быть объектами любого типа. Каждый ключ встречается только один раз, но вы можете использовать одно и то же значение несколько раз. Поддержка Dart для карт обеспечивается литералами карты и типом Map
.
var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
var nobleGases = {
2: 'helium',
10: 'neon',
18: 'argon',
};
gifts
имеет тип Map<String,String>
, а nobleGases
имеет тип Map<int, String>
. Если вы попытаетесь добавить неверный тип значения на карту, анализатор или среда выполнения выдаст ошибку. Для получения дополнительной информации читайте о выводе типа. Вы можете создать те же объекты, используя конструктор Map
:
var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';
var nobleGases = Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';
Добавьте новую пару ключ-значение на существующую карту так же, как в JavaScript:
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair
Получить значение из карты так же, как в JavaScript:
var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');
Если вы ищете ключ, которого нет на карте, вы получите нулевое взамен:
var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);
Используйте .length, чтобы получить количество пар ключ-значение на карте:
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);
Чтобы создать карту с постоянной времени компиляции, добавьте const
перед литералом карты:
final constantMap = const {
2: 'helium',
10: 'neon',
18: 'argon',
};
// constantMap[2] = 'Helium'; // Uncommenting this causes an error.
Начиная с Dart 2.3, карты поддерживают операторы распространения (...
и ...?
) И коллекции, если и для, как списки. Для получения подробной информации и примеров см. Предложение оператора распространения и предложение коллекций потока управления.
Для получения дополнительной информации о картах см. Обобщения Generics и Карты Maps.
Руны — Runes
В Dart руны — это кодовые позиции UTF-32 строки.
Unicode определяет уникальное числовое значение для каждой буквы, цифры и символа, используемых во всех мировых системах письма. Поскольку строка Dart представляет собой последовательность единиц кода UTF-16, для выражения 32-битных значений Unicode в строке требуется специальный синтаксис.
Обычный способ выражения кодовой позиции Unicode — это \uXXXX
, где XXXX
— это шестнадцатеричное 4-значное значение. Например, символ сердца (♥
) — это \u2665
. Чтобы указать более или менее 4 шестнадцатеричных цифр, поместите значение в фигурные скобки. Например, смеющийся смайлик (?
) — это \u{1f600}
.
Класс String
имеет несколько свойств, которые вы можете использовать для извлечения информации о рунах. Свойства codeUnitAt
и codeUnit
возвращают 16-битные единицы кода. Используйте свойство runes
, чтобы получить руны строки.
Следующий пример иллюстрирует взаимосвязь между рунами, 16-разрядными кодовыми единицами и 32-разрядными кодовыми позициями
main() {
var clapping = '\u{1f44f}';
print(clapping);
print(clapping.codeUnits);
print(clapping.runes.toList());
Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(new String.fromCharCodes(input));
}
Символы — Symbols
Объект Symbol
представляет оператор или идентификатор, объявленный в программе Dart. Возможно, вам никогда не понадобится использовать символы, но они неоценимы для API, которые ссылаются на идентификаторы по имени, потому что минификация меняет имена идентификаторов, но не символы идентификаторов.
Чтобы получить символ для идентификатора, используйте символьный литерал, который просто пишется, как #
, за которым следует идентификатор:
#radix
#bar
Символьные литералы являются константами времени компиляции.