Menu
Coddy logo textTech

is_ok() и is_err()

Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 44 из 66.

Иногда вам нужно быстро проверить, представляет ли Result успех или ошибку, не извлекая фактические значения. Rust предоставляет для этого два удобных метода: .is_ok() и .is_err().

Оба метода возвращают логическое значение, что делает их идеальными для простых условных проверок. Метод .is_ok() возвращает true, если Result имеет значение Ok, и false, если это Err. Метод .is_err() работает в обратном порядке:

let success: Result = Ok(42);
let failure: Result = Err("Something went wrong");

if success.is_ok() {
    println!("Operation succeeded!");
}

if failure.is_err() {
    println!("Operation failed!");
}

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

challenge icon

Задание

Легко

Вы получите два входных значения. Первое значение — это число (в виде строки), а второе — индикатор статуса (success или failure). Создайте Result<i32, &'static str> на основе этого статуса. Если статус равен success, создайте Ok, содержащий распарсенное число. Если статус равен failure, создайте Err с сообщением "Operation failed". Используйте .is_ok() и .is_err(), чтобы проверить статус результата и вывести соответствующее сообщение.

Требования:

  • Прочитайте первый ввод (число) и удалите лишние пробелы
  • Распарсите первый ввод в тип i32
  • Прочитайте второй ввод (статус) и удалите лишние пробелы
  • Создайте переменную типа Result<i32, &'static str>:
    • Если статус равен success, присвойте Ok(parsed_number)
    • Если статус равен failure, присвойте Err("Operation failed")
  • Используйте .is_ok(), чтобы проверить, является ли результат успешным:
    • Если это так, выведите: Success detected
  • Используйте .is_err(), чтобы проверить, является ли результат ошибкой:
    • Если это так, выведите: Error detected

Ввод:

  • Первая строка: Число (например, 42)
  • Вторая строка: Либо success, либо failure

Вывод:

  • Если статус success: Success detected
  • Если статус failure: Error detected

Шпаргалка

Rust предоставляет два метода для проверки статуса Result без извлечения его значений:

  • .is_ok() - возвращает true, если Result является Ok, и false в противном случае
  • .is_err() - возвращает true, если Result является Err, и false в противном случае
let success: Result<i32, &str> = Ok(42);
let failure: Result<i32, &str> = Err("Something went wrong");

if success.is_ok() {
    println!("Operation succeeded!");
}

if failure.is_err() {
    println!("Operation failed!");
}

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

Попробуйте сами

use std::io;

fn main() {
    // Прочитать первый ввод (число)
    let mut number_input = String::new();
    io::stdin().read_line(&mut number_input).expect("Failed to read line");
    let number_input = number_input.trim();
    
    // Преобразовать число в i32
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // Прочитать второй ввод (статус)
    let mut status = String::new();
    io::stdin().read_line(&mut status).expect("Failed to read line");
    let status = status.trim();
    
    // TODO: Создать Result<i32, &'static str> на основе статуса
    // Если статус "success", создать Ok(parsed_number)
    // Если статус "failure", создать Err("Operation failed")
    
    // TODO: Использовать .is_ok() и .is_err(), чтобы проверить результат и вывести соответствующее сообщение
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow