Если topaz check отклоняет привычную запись, найдите ниже её замену в Топазе. Для возможностей без прямой замены выберите подходящий способ получить нужный результат.
Запустите поддерживаемые формы
Установите Топаз по разделу Первая программа и сохраните код в forbidden-deferred.tpz.
let mut количество = 0
let значения: Array<int> = [1, 2]
let преобразовать: (int) -> int = значение => значение + 1
match значения {
case [голова, ..хвост] => {
количество = преобразовать(голова) + хвост.length
}
case [] => {
количество = 0
}
}
print("{количество}")В папке с файлом выполните проверку и запуск.
topaz check forbidden-deferred.tpz
topaz run forbidden-deferred.tpzПроверка проходит, программа выводит следующий результат.
3Объявление let mut разрешает менять количество. Шаблон связывает голова с 1, а хвост с [2]. Вызов преобразовать(голова) возвращает 2. Прибавление длины хвоста даёт 3. Тип (int) -> int описывает функцию, сохранённую в преобразовать.
Замените неподдерживаемую запись
| Если вы написали | Используйте |
|---|---|
mut let count = 0 | let mut count = 0 |
count++ или count-- | count = count + 1 или count = count - 1 |
[T] как тип | Array<T> |
function(T) -> U как тип | (T) -> U |
args: ...T | ...args: T |
[head, ...tail] | [head, ..tail] |
Анонимную function (...) { ... } | Лямбду, например value => value + 1 |
Обратные кавычки или ${value} | Двойные кавычки и интерполяцию {value} |
Индекс или .length у строки | text.scalars(), затем операции Array |
Если в forbidden-deferred.tpz заменить let mut на mut let, проверка завершится ошибкой. Верните let mut в первой строке, затем снова проверьте и запустите файл.
При импорте укажите нужные члены модуля. Экспортируемые объявления помечайте словом export в месте объявления. Формы показаны в разделе Модули и видимость. use, строковые и шаблонные пути модулей, списки export, экспорт всех имён, повторный экспорт и переименование при экспорте не поддерживаются.
Выберите альтернативу неподдерживаемой возможности
Следующие возможности недоступны в текущем языке. Альтернативы решают указанные задачи, но могут потребовать изменения структуры программы.
| Задача | Неподдерживаемая возможность | Доступный выбор |
|---|---|---|
| Исследовать текст | API кластеров графем и прямые срезы строк | scalars(), если подходит разделение по скалярам Unicode |
| Создать текст или структурированный шаблон | HTML и пользовательские теги | Строки или встроенные p, r, sh, sql по назначению |
| Задать требования к обобщениям | Ограничения высших рангов и общая динамическая диспетчеризация протоколов | Ограничения именованных функций из раздела Функции и обобщения |
| Описать рекурсивные данные | Рекурсивные псевдонимы типов | Поддерживаемые объявления enum из раздела Записи и номинальные данные |
| Поделиться объявлениями между модулями | Повторный экспорт пакетов | Импорт членов из объявившего их модуля |
| Развернуть элементы | Общее разворачивание итерируемых значений | Разворачивание Array в поддерживаемых позициях или явный цикл |
| Выполнить работу одновременно | async и await | concurrent, если подходит сбор именованных результатов с тайм-аутом |
| Закрыть ресурсы | Асинхронная очистка | Синхронный defer или поддерживаемые формы using |
| Обработать ожидаемый сбой | Перехват ошибок выполнения и panic, throw, catch | Возврат исправимых ошибок в Result |
| Прочитать опциональное поле в конвейере | Сокращённая запись опционального поля в конвейере | Явное выражение с ?. |
Ошибка выполнения останавливает программу. Смена синтаксиса не превращает её в исправимую ошибку Result. Предотвратите недопустимую операцию или используйте API, возвращающий ошибку как значение. Подробнее в разделе Null, Option, Result и ошибки.
Формы Rust &self, &mut self, Vec<T> и use crate:: не входят в синтаксис Топаза. Используйте impl Name на уровне модуля, встроенные коллекции, явный импорт и обновление записей Топаза.
Примеры собраны в Кратком обзоре синтаксиса. Для исправления операторов откройте Операторы и выражения.