Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Реализация трейтов

// 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 даже могут быть разнесены по нескольким модулям или файлам.