Базовые типы: 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.4

17 яблок на 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 — текст, соединяется оператором &, число перед склейкой нужно превратить в строку через $.
  • booltrue/false, логические операторы записываются словами and, or, not.
Проверьте себя
1. Что вернёт выражение 17 div 5 в Nim?
A3.4
B3
C2
DОшибку компиляции
2. Как правильно соединить строку и число в одну строку в Nim?
A"Мне " + age + " лет"
B"Мне " & age & " лет"
C"Мне " & $age & " лет"
Df"Мне {age} лет"