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>
.