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_subpentru sume de bani: o eroare de calcul trece neobservată, iar rezultatul este doar „lipit” de limită. Acolochecked_subeste 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ă.