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

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

Сопоставьте ваш опыт в Python, JavaScript, Java или Rust с конструкциями этого языка, включая сознательно исключённые возможности.

Результат: вы переведёте имеющиеся привычки в конструкции, принятые в этом языке, и узнаете, для каких из них намеренно не предусмотрены аналоги.

Что нужно знать: умение читать код хотя бы на одном языке программирования. Опыт работы с данным языком не требуется.

Начните с того, что переносится без изменений

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

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

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

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

Четыре различия, которые действительно важны

Изменяемость включается явно. Переменную, объявленную через обычный let, нельзя повторно присвоить. Синтаксис let mut явно указывает, что повторное присваивание входит в замысел. В языках с неявной изменяемостью часто приходится анализировать всё тело функции, чтобы определить меняющиеся переменные. Здесь это видно непосредственно из объявления.

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

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

У полномочий хоста есть явная граница. Файловые операции и ввод-вывод доступны исключительно через выбранный профиль хоста или продукта, а веб-продукт получает только явно объявленные ограниченные возможности. Сигнатура функции отображает данные и восстанавливаемые ошибки. Импорты, конфигурация пакета и выбранный профиль достраивают модель полномочий. В разделе Чтение реального файла используются все эти признаки.

Чего здесь нет намеренно

О паттернах, для которых здесь не предусмотрено аналогов, лучше узнать заранее, чтобы не пытаться применять их по привычке.

Здесь отсутствуют иерархии классов и наследование. Структура данных определяется записями, а поведение реализуется в принимающих их функциях. Если привычный подход требует использования базового класса и переопределения методов, используйте записи и явные функции.

Здесь нет рефлексии над программой во время выполнения, нет динамической диспетчеризации через таблицу протокола и нет полиморфизма строк записей. Точный список отложенного приведён в разделе Записи и номинальные данные.

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

Эти ограничения введены осознанно. Ключевые решения остаются видимыми в объявлениях и конфигурации продукта, при этом одна сигнатура функции не выдаётся за полное описание всех взаимодействий с хостом.

Таблица перевода на первый час

Ваш dict, Map или HashMap соответствует коллекции, описанной в разделе Коллекции и включения. Класс, содержащий только данные, обычно сопоставляется с записью. Контракт, аналогичный интерфейсу, стоит проектировать через явные сигнатуры функций. Для обобщённого контракта используйте статический протокол без динамической диспетчеризации во время выполнения. Логика обработчиков try/except сопоставляется с возвращаемым значением Result. Обычный опциональный результат использует Option, а внешние nullable-данные при необходимости — T | null. Проверяющая система сохраняет это различие явным.

Попробуйте

Вам нужна функция, которая ищет задачу по названию и может её не найти. Прежде чем открыть ответ, определите, каким должен быть тип её результата.

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

Option с задачей, а не сама задача. Отсутствие результата — обычный исход поиска, а не ошибка, поэтому оно выражается в типе как отсутствие. Result подошёл бы, если бы мог завершиться сбоем сам поиск (например, если бы перед этим пришлось прочитать файл). Выбор между отсутствием и ошибкой — решение, которое язык требует принимать явно. Единожды зафиксированное в сигнатуре, оно избавляет вызывающий код от неоднозначности.

Готовы двигаться дальше, если

Вы можете перечислить четыре ключевых различия, назвать привычный паттерн из вашего прежнего языка, не имеющий здесь аналога, и выбрать между отсутствием значения и ошибкой для проектируемой функции.

Если вы ещё не прошли курс, начните с раздела Первая программа или переходите к обзору конструкций в разделе Краткий обзор синтаксиса.