Найти в Дзене
Один Rust не п...Rust

SASE на Rust

t.me/oneRustnoqRust Для чего нужна данная статья? : Написать библиотеку обработки яркости экрана, гарантирующую, что уровень яркости не выйдет за пределы диапазона [0, 255]. Зачем Вам это уметь? : Для безопасной работы с числами, чтобы избежать переполнений при выполнении арифметических операций. Это особенно полезно для вычислений, которые могут выйти за пределы диапазона чисел, представленных данным типом. saturating_add_signed : fn main() { let x: u32 = 10; let y: i32 = -15; let result = x.saturating_add_signed(y); // 0 (насыщение на нижнюю границу) println!("{}", result); } fn adjust_brightness(current: u8, adjustment: i8) -> u8 { current.saturating_add_signed(adjustment) } fn main() { let brightness: u8 = 100; let adjustment: i8 = -120; let new_brightness = adjust_brightness(brightness, adjustment); // 0 (нижний предел) println!("New Brightness: {}", new_brightness); } saturating_sub: fn main() { let a: u8 = 10; let b: u8 = 20; let result = a.saturating_sub(b); // 0 println!("{}
Оглавление
ML на RUST без заморочек

t.me/oneRustnoqRust

Для чего нужна данная статья? :

Написать библиотеку обработки яркости экрана, гарантирующую, что уровень яркости не выйдет за пределы диапазона [0, 255].

Зачем Вам это уметь? :

Для безопасной работы с числами, чтобы избежать переполнений при выполнении арифметических операций. Это особенно полезно для вычислений, которые могут выйти за пределы диапазона чисел, представленных данным типом.

Избежание переполнения при арифметических действиях с отрицательным или положительным значением:

saturating_add_signed :

  • Эта функция позволяет добавить знаковое значение (iN) к беззнаковому (uN) и избежать ошибок переполнения.
  • Если результат выходит за пределы диапазона целевого типа, результат "насыщается" (становится минимальным или максимальным значением).

fn main() {

let x: u32 = 10;

let y: i32 = -15;

let result = x.saturating_add_signed(y); // 0 (насыщение на нижнюю границу)

println!("{}", result);

}

fn adjust_brightness(current: u8, adjustment: i8) -> u8 {

current.saturating_add_signed(adjustment)

}

fn main() {

let brightness: u8 = 100;

let adjustment: i8 = -120;

let new_brightness = adjust_brightness(brightness, adjustment); // 0 (нижний предел)

println!("New Brightness: {}", new_brightness);

}

saturating_sub:

  • Для вычитания с насыщением.

fn main() {

let a: u8 = 10;

let b: u8 = 20;

let result = a.saturating_sub(b); // 0

println!("{}", result);

}

checked_add, checked_sub:

  • Проверяют переполнение и возвращают Option<T>.

fn main() {

let a: u8 = 250;

let b: u8 = 10;

let result = a.checked_add(b); // None (переполнение)

println!("{:?}", result);

}

wrapping_add, wrapping_sub:

  • Разрешают переполнение, оборачивая значения (цикличное переполнение).

fn main() {

let a: u8 = 250;

let b: u8 = 10;

let result = a.wrapping_add(b); // 4 (цикл через 255)

println!("{}", result);

}

overflowing_add, overflowing_sub:

  • Возвращают результат и флаг переполнения ((result, overflowed)).

fn main() {

let a: u8 = 250;

let b: u8 = 10;

let (result, overflowed) = a.overflowing_add(b); // (4, true)

println!("Result: {}, Overflowed: {}", result, overflowed);

}

clamp:

  • Для ограничений результата в диапазоне.

fn main() {

let x: i32 = 100;

let clamped = x.clamp(0, 50); // 50

println!("{}", clamped);

}

Гарантия безопасности при обработке данных:

Используется в алгоритмах, где нужно гарантировать, что значения не выйдут за допустимые пределы, например, при работе с ограничениями в графике, играх или обработке аудиосигналов.

Контроль переполнений при изменении индексов:

Полезно для безопасного вычисления индексов массива или других структур данных, чтобы избежать выхода за границы.

Работа с ограниченными ресурсами:

Используется для работы с ограниченными ресурсами, такими как батарея, память или вычислительная мощность, где критически важно не выйти за пределы допустимых значений.

Программа для управления яркостью экрана. (Пользователь может увеличивать или уменьшать яркость с шагом, но значение яркости должно оставаться в пределах от 0 до 255).

  • Структура Screen:Хранит уровень яркости экрана в виде u8, который ограничен диапазоном [0, 255].
  • Метод adjust_brightness:Использует saturating_add_signed, чтобы безопасно изменять яркость, учитывая положительные и отрицательные значения.
    Автоматически ограничивает результат в пределах допустимого диапазона.
  • Проверка насыщения:Увеличение яркости на 200 приводит к насыщению на верхней границе (255).
    Уменьшение яркости на 300 приводит к насыщению на нижней границе (0).

struct Screen {

brightness: u8, // Уровень яркости от 0 до 255

}

impl Screen {

fn new() -> Self {

Screen { brightness: 128 } // По умолчанию средняя яркость

}

/// Изменение яркости с учетом насыщения

fn adjust_brightness(&mut self, adjustment: i8) {

self.brightness = self.brightness.saturating_add_signed(adjustment);

}

/// Получение текущего уровня яркости

fn get_brightness(&self) -> u8 {

self.brightness

}

}

fn main() {

let mut screen = Screen::new();

println!("Начальная яркость: {}", screen.get_brightness());

// Уменьшаем яркость на 50

screen.adjust_brightness(-50);

println!("После уменьшения на 50: {}", screen.get_brightness());

// Увеличиваем яркость на 200

screen.adjust_brightness(200);

println!("После увеличения на 200: {}", screen.get_brightness());

// Уменьшаем яркость на 300 (пробуем выйти за нижнюю границу)

screen.adjust_brightness(-300);

println!("После уменьшения на 300: {}", screen.get_brightness());

}