i32::rem_euclid în Rust

Restul împărțirii care este mereu pozitiv (sau zero), spre deosebire de %, care păstrează semnul.

Sintaxă
const fn rem_euclid(self, rhs: i32) -> i32
const fn div_euclid(self, rhs: i32) -> i32

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) % n ca indice circular: pentru i = 0 rezultatul este -1, iar conversia la usize dă un număr uriaș. Folosește rem_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.