i32::saturating_sub în Rust

Scade, dar se oprește la limita tipului în loc să depășească: i32::MIN.saturating_sub(1) rămâne i32::MIN.

Sintaxă
const fn saturating_sub(self, rhs: i32) -> i32
// la fel: saturating_add, saturating_mul, saturating_pow

Ce face i32::saturating_sub

Operațiile saturating_* „se lipesc” de limită: dacă rezultatul ar fi sub minim, primești minimul; dacă ar fi peste maxim, primești maximul. Nu există panică și nici Option de tratat.

Sunt foarte utile la tipurile fără semn, unde minimul este 0: stoc.saturating_sub(vandute) nu coboară niciodată sub zero. Le folosești când valoarea de la limită este un răspuns acceptabil (o bară de progres, un volum, viețile într-un joc).

Parametri

Parametru Descriere
rhs Valoarea scăzută.

Ce returnează

i32, limitat la intervalul i32::MIN..=i32::MAX.

Exemple

Exemplul 1: Stoc care nu scade sub zero

Stocul este u32. Cu scădere normală, a doua comandă ar da depășire (panică în debug).

fn main() {
    let mut stoc: u32 = 5;
    for comanda in [3, 4, 2] {
        let livrat = comanda.min(stoc);
        stoc = stoc.saturating_sub(comanda);
        println!("comandă {comanda}, livrat {livrat}, rămas în stoc: {stoc}");
    }
}

Rezultat

comandă 3, livrat 3, rămas în stoc: 2
comandă 4, livrat 2, rămas în stoc: 0
comandă 2, livrat 0, rămas în stoc: 0

Exemplul 2: Limitele lui i32

fn main() {
    println!("{}", i32::MIN.saturating_sub(1));
    println!("{}", (-2_000_000_000_i32).saturating_sub(500_000_000));
    println!("{}", 100_i32.saturating_sub(30));
    println!("{}", i32::MAX.saturating_add(1));
    println!("{}", 70_000_i32.saturating_mul(70_000));
}

Rezultat

-2147483648
-2147483648
70
2147483647
2147483647

Greșeli frecvente

  • Folosești saturating_sub pentru sume de bani: o eroare de calcul trece neobservată, iar rezultatul este doar „lipit” de limită. Acolo checked_sub este mai sigur.

Comenzi înrudite

  • i32::checked_add: Adună și returnează Some(rezultat) sau None dacă rezultatul depășește limitele tipului.
  • i32::wrapping_add: Adună cu „întoarcere”: după MAX urmează MIN. overflowing_add spune și dacă a avut loc depășirea.
  • f64::clamp: Limitează valoarea la un interval: sub min devine min, peste max devine max, altfel rămâne neschimbată.