Operatörün Aşırı Yüklenmesi

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.

Cairo'da, operatör aşırı yüklemesi belirli özelliklerin uygulanması yoluyla gerçekleştirilir. Her operatörün ilişkili bir özelliği vardır ve o operatörü aşırı yüklemek, bir özel tür için bu özelliğin bir uygulamasını sağlamayı içerir. Ancak, operatör aşırı yüklemesini dikkatli kullanmak esastır. Kötüye kullanım, operatörün aşırı yüklenmesine semantik bir anlamın olmaması durumunda olduğu gibi, kodun daha zor bakımını yapılabilir hale getirerek kafa karışıklığına yol açabilir.

İki Potionsun birleştirilmesi gereken bir örneği düşünün. Potionsun iki veri alanı vardır, mana ve sağlık. İki Potionsun birleştirilmesi, ilgili alanlarının toplanmasını sağlamalıdır.

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, '');
}

Yukarıdaki kodda, Potion türü için Add özelliğini uyguluyoruz. add fonksiyonu iki argüman alır: lhs ve rhs (sol ve sağ taraf). Fonksiyon gövdesi, lhs ve rhs'nin bir kombinasyonu olan yeni bir Potion örneği döndürür.

Örnekte gösterildiği gibi, bir operatörün aşırı yüklenmesi, aşırı yüklenen somut türün belirtilmesini gerektirir. Aşırı yüklenen genel özellik Add<T>'dir ve Potion türü için Add<Potion> ile somut bir uygulama tanımlıyoruz.