Peng-overloadan Operator

Operator overloading is a feature in some programming languages that allows the redefinition of standard operators, such as addition (+), subtraction (-), multiplication (*), and division (/), to work with user-defined types. This can make the syntax of the code more intuitive, by enabling operations on user-defined types to be expressed in the same way as operations on primitive types.

Di Cairo, operator overloading dicapai melalui implementasi trait khusus. Setiap operator memiliki trait terkait, dan pengulangan operator melibatkan penyediaan implementasi trait tersebut untuk tipe kustom. Namun, penting untuk menggunakan operator overloading dengan bijak. Penyalahgunaan dapat menyebabkan kebingungan, membuat kode menjadi lebih sulit untuk dikelola, misalnya ketika tidak ada makna semantik pada operator yang di-overload.

Pertimbangkan contoh di mana dua Potion perlu digabungkan. Potion memiliki dua bidang data, yaitu mana dan kesehatan. Menggabungkan dua Potion seharusnya menambahkan bidang masing-masing.

struct Potion {
    health: felt252,
    mana: felt252,
}

impl PotionAdd of Add<Potion> {
    fn add(lhs: Potion, rhs: Potion) -> Potion {
        Potion { health: lhs.health + rhs.health, mana: lhs.mana + rhs.mana }
    }
}

fn main() {
    let health_potion: Potion = Potion { health: 100, mana: 0 };
    let mana_potion: Potion = Potion { health: 0, mana: 100 };
    let super_potion: Potion = health_potion + mana_potion;
    // Both potions were combined with the `+` operator.
    assert(super_potion.health == 100, '');
    assert(super_potion.mana == 100, '');
}

Dalam kode di atas, kami sedang mengimplementasikan trait Add untuk tipe Potion. Fungsi tambah mengambil dua argumen: lhs dan rhs (kiri dan kanan). Tubuh fungsi mengembalikan instance Potion baru, dengan nilai bidangnya merupakan kombinasi dari lhs dan rhs.

Seperti yang diilustrasikan dalam contoh tersebut, pengoverloadan operator memerlukan spesifikasi tipe konkret yang di-overload. Trait generik yang di-overload adalah Add<T>, dan kami mendefinisikan implementasi konkret untuk tipe Potion dengan Add<Potion>.