💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат, результаты по 5 тематическим шкалам и подробные объяснения.
Вопрос 16 из 25
Что исправляет не симптом, а саму ошибку вокруг `macro_lib::vec_of_strings`?
Rust Rust · Тестирование и инструменты Cargo Копировать
/// ```
/// use macro_lib::vec_of_strings;
/// let v = vec_of_strings![1, 2];
/// assert_eq!(v, ["1", "2"]);
/// ```
/// ```compile_fail
/// let _ = macro_lib::vec_of_strings![let x = 1];
/// ```
pub fn macro_docs() {}
Разбирать вход `macro_lib::vec_of_strings` как строку и собирать выход конкатенацией, не сохраняя токены, spans и гигиену.
Игнорировать spans и формировать все ошибки на имени самого макроса, а не на проблемном токене. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым.
Считать один модульный тест внутри crate достаточным для проверки экспорта и путей пользователя. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым. Следовательно, для `macro_docs` не понадобилось бы явное предусловие.
Ограничиться снимком раскрытия макроса и не компилировать его через внешний путь использования. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым. В результате `macro_docs` считали бы безопасным и на путях, которых пример не выполняет.
Для макроса тестировать каждую ветвь, пустой ввод, завершающие разделители, ошибки синтаксиса, гигиену и использование из внешнего crate.
Вопрос 21 из 25
Как изменить фрагмент с `to_string`, не перенося ошибку на время выполнения?
Rust Rust · Декларативные макросы macro_rules Копировать
macro_rules! vec_of_strings {
($($x:expr),* $(,)?) => { vec![$($x.to_string()),*] };
}
let v = vec_of_strings![1, "two",];
Поставить самый общий шаблон первым и рассчитывать, что компилятор позже выберет более специфичный. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым.
Разбирать вход `macro_rules` как строку и собирать выход конкатенацией, не сохраняя токены, spans и гигиену. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым.
Заменить все фрагменты на tt и собирать синтаксис строковыми операциями внутри раскрытия. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым.
Ограничиться снимком раскрытия макроса и не компилировать его через внешний путь использования. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым. Поэтому ошибочный сценарий вокруг `to_string` не проверяли бы отдельно.
Ограничивать синтаксис макроса ясными шаблонами и делегировать вычисление обычным функциям, где это возможно; поддерживать завершающую запятую для эргономики.