00
:
00
:
00
:
00
Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

Operatori di Comparazione in Rust

Gli operatori di comparazione in Rust permettono di confrontare valori e restituiscono un bool. Sono implementati tramite i trait PartialEq, Eq, PartialOrd e Ord.

Operatori Disponibili

Operatore Descrizione Trait
== Uguale a PartialEq
!= Diverso da PartialEq
< Minore di PartialOrd
> Maggiore di PartialOrd
<= Minore o uguale PartialOrd
>= Maggiore o uguale PartialOrd

Confronto tra Tipi Primitivi

fn main() {
    let a = 10;
    let b = 20;

    println!("{}", a == b);  // false
    println!("{}", a != b);  // true
    println!("{}", a < b);   // true
    println!("{}", a > b);   // false
    println!("{}", a <= 10); // true
    println!("{}", a >= 20); // false
}

Confronto tra Stringhe

fn main() {
    let s1 = "abc";
    let s2 = "abd";

    println!("{}", s1 == s2);   // false
    println!("{}", s1 < s2);    // true (confronto lessicografico)
    println!("{}", "A" < "a");  // true (A=65, a=97)

    let owned: String = String::from("ciao");
    println!("{}", owned == "ciao"); // true - String si confronta con &str
}

PartialEq e Eq

PartialEq permette confronti di uguaglianza parziali (non tutti i valori sono confrontabili, come f64::NAN). Eq garantisce uguaglianza totale.

// f64 implementa PartialEq ma NON Eq
let nan = f64::NAN;
println!("{}", nan == nan); // false! NaN non è uguale a se stesso

// i32 implementa sia PartialEq che Eq
let x: i32 = 5;
println!("{}", x == x); // true, sempre

Derivare PartialEq per Struct

#[derive(PartialEq, Debug)]
struct Punto {
    x: f64,
    y: f64,
}

fn main() {
    let p1 = Punto { x: 1.0, y: 2.0 };
    let p2 = Punto { x: 1.0, y: 2.0 };
    let p3 = Punto { x: 3.0, y: 4.0 };

    println!("{}", p1 == p2); // true
    println!("{}", p1 != p3); // true
}

PartialOrd e Ord

#[derive(PartialEq, PartialOrd)]
struct Voto {
    punteggio: f64,
}

fn main() {
    let v1 = Voto { punteggio: 8.5 };
    let v2 = Voto { punteggio: 9.0 };

    println!("{}", v1 < v2);  // true
    println!("{}", v1 > v2);  // false
}

Implementazione Manuale

use std::cmp::Ordering;

struct Studente {
    nome: String,
    media: f64,
}

impl PartialEq for Studente {
    fn eq(&self, other: &Self) -> bool {
        self.media == other.media
    }
}

impl PartialOrd for Studente {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        self.media.partial_cmp(&other.media)
    }
}

Conclusione

Gli operatori di comparazione in Rust sono basati su trait, rendendo il sistema estensibile e type-safe. La distinzione tra Partial e totale (Eq/Ord) gestisce correttamente casi come i numeri floating-point con NaN. Usa #[derive] per generare automaticamente le implementazioni sui tuoi tipi personalizzati.