💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат, результаты по 4 тематическим шкалам и подробные объяснения.
Вопрос 2 из 20
Как обновить фрагмент с `String::from`, чтобы ошибка исчезла по существу?
Rust Rust · Структуры struct Копировать
struct User { name: String, active: bool }
let user = User { name: String::from("Ada"), active: true };
let name = user.name;
println!("{}", user.active);
Если после чтения имени нужен весь User, заимствовать поле как &user.name или клонировать строку осознанно.
Заменить выражение с `User` отдельным оператором и отбросить его значение, не меняя окружающий контракт «Структуры struct».
Добавить `mut` или явное приведение типа рядом с `User`, сохранив прежнюю логику выражения и порядок вычислений.
Перенести проверку результата `User` на время выполнения и возвращать значение по умолчанию при несовпадении типов или ветвей.
Клонировать всё значение, связанное с данные этого фрагмента, чтобы не разбирать, какая часть действительно перемещается или заимствуется.
Вопрос 13 из 20
Какой вариант правки возвращает фрагмент с `User` к корректному контракту?
Rust Rust · Обновление структуры Копировать
struct User { name: String, email: String, active: bool }
let base = User { name: "Ada".into(), email: "a@x".into(), active: true };
let copy = User { email: "new@x".into(), ..base };
println!("{}", base.active);
Клонировать всё значение, связанное с данные этого фрагмента, чтобы не разбирать, какая часть действительно перемещается или заимствуется. По этой логике отдельная проверка `into` на другом входе считалась бы лишней.
Заменить выражение с `User` отдельным оператором и отбросить его значение, не меняя окружающий контракт «Обновление структуры».
Перенести проверку результата `User` на время выполнения и возвращать значение по умолчанию при несовпадении типов или ветвей. Проверку ошибки для `into` при таком подходе заменили бы успешным примером.
Если нужен и base целиком, клонировать только перемещаемые поля либо строить новую структуру из ссылок; не считать..base полной копией.
Добавить `mut` или явное приведение типа рядом с `User`, сохранив прежнюю логику выражения и порядок вычислений. Из этого следовало бы, что иной порядок операций для `into` ничего не меняет.
Вопрос 15 из 20
Какой путь выполнения выберет Rust после `User`?
Rust Rust · Обновление структуры Копировать
struct User { name: String, email: String, active: bool }
let base = User { name: "Ada".into(), email: "a@x".into(), active: true };
let copy = User { email: "new@x".into(), ..base };
println!("{}", base.active);
Этот фрагмент будет отклонён: метод вызывается через точку, а не через полное имя типа. До последней строки и наблюдаемого результата программа при таком разборе не доходит.
Компилятор отвергнет фрагмент, поскольку все числовые литералы обязаны иметь явную аннотацию типа. До последней строки и наблюдаемого результата программа при таком разборе не доходит.
Компилятор примет фрагмент: частичное перемещение поля оставляет структуру целиком доступной для форматирования.
Код компилируется и печатает true: active скопирован, name перемещён в copy, а email для copy задан заново; base целиком больше недоступен.
Ошибка возникнет на этапе компиляции: кортеж содержит поле типа Copy рядом с владеющим полем. До последней строки и наблюдаемого результата программа при таком разборе не доходит.