Начало работы

Переход с других языков

Сравните знакомые конструкции с Топазом и выберите нужные уроки.

Если вы уже пишете на Python, JavaScript, Java или Rust, сравните знакомые конструкции с Топазом. Различия помогут выбрать следующий урок без повторения основ программирования.

Прочитайте знакомый расчёт

Эта функция складывает длительность задач из массива.

TOPAZ
record Задача {
    название: string,
    минуты: int
}

function всегоМинут(задачи: Array<Задача>) -> int {
    let mut всего = 0
    for задача in задачи {
        всего = всего + задача.минуты
    }
    всего
}

Для задач длительностью 10 и 25 минут функция всегоМинут вернёт 35. Этот фрагмент объявляет запись и функцию, но не вызывает её. Объявление let mut всего позволяет обновлять сумму в цикле. Последнее выражение всего задаёт возвращаемое значение.

Четыре различия

Для повторного присваивания нужен let mut. Имени, объявленному через let, нельзя присвоить новое значение. Используйте let mut для переменной, значение которой потребуется заменить.

Обрабатываемые ошибки возвращаются через Result. Обработайте возвращённую ошибку или передайте её вызывающему коду с помощью ?. В Топазе нет синтаксиса перехвата исключений. Ошибка времени выполнения останавливает программу, и обработать её как возвращённую ошибку нельзя.

Возможное отсутствие значения отражается в типе. Используйте Option<T>, если результат может отсутствовать. Для внешних данных, допускающих null, используйте T | null. Это разные типы, и перед использованием содержащегося значения нужно обработать его отсутствие.

Доступ к файлам зависит от среды выполнения. Профиль задаёт набор поддерживаемых функций и правил выполнения. Если код работает с файлами или другим вводом и выводом, проверьте импорты, настройки пакета и выбранный профиль. Типы входных данных и результата указаны в сигнатуре функции. В разделе Чтение реального файла показано, как читать эти части вместе.

Сопоставьте знакомые конструкции

Знакомая конструкцияФорма в Топазе
dict, Map или HashMapMap хранит ключи и значения. См. Коллекции и включения.
Класс для объединения данныхrecord объединяет поля. Функции обрабатывают такие записи.
Интерфейс для обобщённого кодаЯвные сигнатуры функций и статические протоколы описывают необходимые операции. У протоколов нет динамической диспетчеризации во время выполнения.
Обработка ошибок через try/exceptВерните Result и обработайте Ok или Err.
Поиск, который может ничего не найтиВерните Option<T> и обработайте Some или None.
Внешние данные, допускающие nullИспользуйте T | null и обработайте null.

Топаз не поддерживает наследование классов и рефлексию для изучения структуры программы во время выполнения. Нет и полиморфизма строк записей, который позволяет оставлять часть полей обобщённого типа записи неопределённой. Модель данных описана в разделе Записи и номинальные данные. Числовые типы не преобразуются неявно, поэтому int не становится автоматически float внутри выражения.

Попробуйте

Функция ищет задачу по названию в списке, который хранится в памяти. Какой тип результата подойдёт, если задача может не найтись?

Показать ответ

Используйте Option<Задача>. Верните Some(задача), если задача найдена, и None, если совпадений нет. Если сама операция может завершиться ошибкой, например при чтении файла, выразите эту ошибку через Result.

Выберите следующий урок

Начните с Первой программы, чтобы установить Топаз и запустить файл. Если вы уже это сделали, выберите нужную тему ниже.

Когда эти примеры станут понятны, объедините их в Первом приложении. Держите рядом Краткий обзор синтаксиса, чтобы искать нужные конструкции во время работы.