Задать вопрос
@historydev
Редактирую файлы с непонятными расширениями

Как решить задачу rustlings?

https://github.com/rust-lang/rustlings/blob/main/e...

Застрял на result_with_list(), по идее мне нужно передать ошибку из divide (DivisionError) в вызывающую функцию, однако как это сделать из метода вектора я не знаю:
// TODO: Calculate `a` divided by `b` if `a` is evenly divisible by `b`.
// Otherwise, return a suitable error.
fn divide(a: i64, b: i64) -> Result<i64, DivisionError> {
    if a % b == 0 {
        return Ok(a / b);
    }
    Err(DivisionError::NotDivisible)
}

// TODO: Add the correct return type and complete the function body.
// Desired output: `Ok([1, 11, 1426, 3])`

fn result_with_list() -> Result<Vec<i64>, DivisionError> {
    let numbers: [i64; 4] = [27, 297, 38502, 81];

    let division_results: Result<Vec<i64>, DivisionError> = numbers
        .into_iter()
        .map(|n| divide(n, 27))
        .collect();

    division_results
}
  • Вопрос задан
  • 89 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
vabka
@vabka Куратор тега Rust
В оригинале задача выглядит так:
#[derive(Debug, PartialEq, Eq)]
enum DivisionError {
    // Example: 42 / 0
    DivideByZero,
    // Only case for `i64`: `i64::MIN / -1` because the result is `i64::MAX + 1`
    IntegerOverflow,
    // Example: 5 / 2 = 2.5
    NotDivisible,
}

// TODO: Calculate `a` divided by `b` if `a` is evenly divisible by `b`.
// Otherwise, return a suitable error.
fn divide(a: i64, b: i64) -> Result<i64, DivisionError> {
    todo!();
}

// TODO: Add the correct return type and complete the function body.
// Desired output: `Ok([1, 11, 1426, 3])`
fn result_with_list() {
    let numbers = [27, 297, 38502, 81];
    let division_results = numbers.into_iter().map(|n| divide(n, 27));
}

// TODO: Add the correct return type and complete the function body.
// Desired output: `[Ok(1), Ok(11), Ok(1426), Ok(3)]`
fn list_of_results() {
    let numbers = [27, 297, 38502, 81];
    let division_results = numbers.into_iter().map(|n| divide(n, 27));
}


В таком случае это вполне является допустимым и корректным решением (код из вопроса):
fn result_with_list() -> Result<Vec<i64>, DivisionError> {
    let numbers: [i64; 4] = [27, 297, 38502, 81];

    let division_results: Result<Vec<i64>, DivisionError> = numbers
        .into_iter()
        .map(|n| divide(n, 27))
        .collect();

    division_results
}


PS: изначально ответ писал ночью и мне показалось, что на входе функция получает 5 чисел, а отдаёт 4 и из-за этого подумал, что нужно пропустить ошибки - тогда можно было бы использовать filter_map для пропуска ошибок.

Изначально задача, видимо, рассчитана на то чтобы познакомить с тем что collect позволяет по разному коллектить итератор из Result
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы