Ce face i32::rem_euclid
Operatorul % dă un rest cu semnul deîmpărțitului: -7 % 3 == -1. (-7).rem_euclid(3) dă 2: restul este mereu între 0 și |rhs| - 1. Perechea div_euclid dă câtul potrivit, astfel încât a == b * a.div_euclid(b) + a.rem_euclid(b).
Este forma corectă pentru calcule „circulare”: zilele săptămânii, orele de pe ceas, pozițiile într-un tablou circular, coordonate care se repetă. Cu %, un pas înapoi de la poziția 0 ar da un indice negativ.
Parametri
| Parametru | Descriere |
|---|---|
rhs |
Împărțitorul. Împărțirea la 0 produce panică. |
Ce returnează
i32.
Exemple
Exemplul 1: Diferența față de %
fn main() {
for a in [7_i32, -7, 6, -1] {
println!(
"{a:>2} % 3 = {:>2} rem_euclid = {} div_euclid = {:>2}",
a % 3,
a.rem_euclid(3),
a.div_euclid(3)
);
}
}
Rezultat
7 % 3 = 1 rem_euclid = 1 div_euclid = 2
-7 % 3 = -1 rem_euclid = 2 div_euclid = -3
6 % 3 = 0 rem_euclid = 0 div_euclid = 2
-1 % 3 = -1 rem_euclid = 2 div_euclid = -1
Exemplul 2: Zilele săptămânii, înainte și înapoi
fn main() {
let zile = ["luni", "marți", "miercuri", "joi", "vineri", "sâmbătă", "duminică"];
let azi: i32 = 0; // luni
for pas in [1, 6, 7, -1, -10] {
let zi = (azi + pas).rem_euclid(7) as usize;
println!("luni {pas:+} zile = {}", zile[zi]);
}
}
Rezultat
luni +1 zile = marți
luni +6 zile = duminică
luni +7 zile = luni
luni -1 zile = duminică
luni -10 zile = vineri
Greșeli frecvente
- Folosești
(i - 1) % nca indice circular: pentrui = 0rezultatul este-1, iar conversia lausizedă un număr uriaș. Foloseșterem_euclid.
Comenzi înrudite
i32::abs: abs() dă valoarea absolută (fără semn); signum() dă -1, 0 sau 1 după semnul numărului.i32: Tipul implicit pentru numere întregi cu semn, pe 32 de biți: de la -2147483648 la 2147483647.i32::checked_add: Adună și returnează Some(rezultat) sau None dacă rezultatul depășește limitele tipului.