Базовые типы: int, float, string, bool
Урок о четырёх базовых типах Nim и о том, чем их поведение отличается от привычного по Python.
Базовый тип — встроенный в язык тип данных, для которого не нужно ничего импортировать: числа, текст, логические значения.
Четыре типа, с которых всё начинается
В любой программе, независимо от языка, данные в итоге сводятся к нескольким простым видам: целые числа, дробные числа, текст и значения «да/нет». В Nim за это отвечают четыре базовых типа: int, float, string и bool. Они похожи на то, что вы видели в Python, но есть нюансы, о которых стоит знать заранее — иначе можно наткнуться на неожиданный результат.
int — целые числа
int хранит целые числа, положительные и отрицательные, без дробной части.
let studentsInClass = 27
let temperatureBelowZero = -12
echo "В классе: ", studentsInClass
echo "Мороз: ", temperatureBelowZeroВывод:
В классе: 27
Мороз: -12Главное отличие от Python, о которое спотыкаются почти все новички: обычное деление / в Nim между целыми числами работает НЕ так, как в Python 3. В Nim оператор / сразу возвращает float, а для целочисленного деления есть отдельные операторы — div (частное) и mod (остаток):
let apples = 17
let friends = 5
echo apples div friends
echo apples mod friends
echo apples / friendsВывод:
3
2
3.417 яблок на 5 друзей — по div получится 3 целых яблока каждому, mod покажет, что 2 яблока останутся лишними, а обычное / сразу даёт точный дробный ответ 3.4. В Python похожая идея выражается через // и % — в Nim та же логика, но записывается словами div и mod, а не значками.
float — дробные числа
float хранит числа с дробной частью — расстояния, деньги, средние значения, проценты.
let price = 149.90
let discount = 0.15
let finalPrice = price * (1.0 - discount)
echo "Цена со скидкой: ", finalPriceВывод:
Цена со скидкой: 127.415Важная деталь: Nim не смешивает int и float в одном выражении молча, как это иногда бывает в других языках. Если один из операндов — int, а второй — float, компилятор потребует явного преобразования:
let items = 3
let weight = 2.5
echo items * weight # ошибка компиляцииВывод:
Error: type mismatch: got <int, float>Чтобы это заработало, целое число нужно явно превратить в дробное функцией float(...):
let items = 3
let weight = 2.5
echo float(items) * weightВывод:
7.5На первый взгляд это выглядит как лишняя строгость, но на практике она защищает от целого класса ошибок, когда программист случайно теряет дробную часть числа, даже не заметив этого.
string — текст
string хранит текст в двойных кавычках. Для соединения строк в Nim используется знак &, а не +, как в Python:
let firstName = "Марк"
let lastName = "Орлов"
let fullName = firstName & " " & lastName
echo fullName
echo "Длина имени: ", len(fullName)Вывод:
Марк Орлов
Длина имени: 10Если нужно вставить в строку число, напрямую через & это не сработает — типы должны совпадать. Число нужно сперва превратить в строку функцией $ (в Nim это специальный оператор преобразования «в строку»):
let age = 15
let message = "Мне " & $age & " лет"
echo messageВывод:
Мне 15 летКстати, функция echo, которую вы уже видели в примерах выше, сама умеет печатать через запятую значения разных типов подряд — внутри неё это преобразование в строку происходит автоматически, поэтому в вызовах echo отдельный $ обычно не нужен.
bool — логические значения
bool хранит одно из двух значений: true или false. Обычно он появляется как результат сравнения:
let age = 17
let canVote = age >= 18
let isTeenager = age >= 13 and age <= 19
echo "Может голосовать: ", canVote
echo "Подросток: ", isTeenagerВывод:
Может голосовать: false
Подросток: trueЛогические операторы в Nim пишутся словами — and, or, not — а не значками &&, ||, как в C-подобных языках. Это делает условия чуть более похожими на обычную речь.
Сводная таблица
| Тип | Хранит | Пример литерала |
int | Целое число | 27, -12 |
float | Дробное число | 149.90, 0.15 |
string | Текст | "Марк" |
bool | Логическое значение | true, false |
Частые ошибки
- Использовать
/там, где нужно целочисленное деление. В Nim/между целыми числами всё равно вернётfloat— для деления нацело и остатка нужныdivиmod. - Складывать
intиfloatбез преобразования. Nim не смешивает числовые типы автоматически — нужно явно привести один из них черезfloat(...)илиint(...). - Пытаться склеить строку с числом через
&напрямую. Число сначала нужно превратить в строку через$, иначе компилятор укажет на несовпадение типов. - Писать
&&и||по привычке из других языков. В Nim логические операторы — это словаand,or,not.
Итоги
int— целые числа, деление нацело и остаток — черезdivиmod, обычное/всегда даётfloat.float— дробные числа, автоматически не смешиваются сintв одном выражении.string— текст, соединяется оператором&, число перед склейкой нужно превратить в строку через$.bool—true/false, логические операторы записываются словамиand,or,not.