Реализация трейтов
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
trait Pet {
fn talk(&self) -> String;
fn greet(&self) {
println!("Oh you're a cutie! What's your name? {}", self.talk());
}
}
struct Dog {
name: String,
age: i8,
}
impl Pet for Dog {
fn talk(&self) -> String {
format!("Woof, my name is {}!", self.name)
}
}
fn main() {
let fido = Dog { name: String::from("Fido"), age: 5 };
dbg!(fido.talk());
fido.greet();
}
-
Чтобы реализовать
TraitдляType, используйте блокimpl Trait for Type { .. }. -
В отличие от интерфейсов Go, одного совпадения методов недостаточно: тип
Catс методомtalk()не будет автоматически удовлетворятьPet, если он не находится в блокеimpl Pet. -
Трейты могут предоставлять реализации по умолчанию для некоторых методов. Реализации по умолчанию могут опираться на все методы трейта. В этом случае
greetпредоставлен и опирается наtalk. -
Для одного типа допускается несколько блоков
impl: как собственных блоковimpl, так и блоковimplтрейтов. Аналогично, для одного типа можно реализовать несколько трейтов (и часто типы реализуют много трейтов!). Блокиimplдаже могут быть разнесены по нескольким модулям или файлам.