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 Potions
un birleştirilmesi gereken bir örneği düşünün. Potions
un iki veri alanı vardır, mana ve sağlık. İki Potions
un 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.