Выбрать главу

println!("копия: {:?}", moved_pair);

// Ошибка! `pair` потеряла свои ресурсы

//println!("оригинал: {:?}", pair);

// ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку

// Скопируем `moved_pair` в `cloned_pair` (включая ресурсы)

let cloned_pair = moved_pair.clone();

// Сбросим оригинальную пару используя std::mem::drop

drop(moved_pair);

// Ошибка! `moved_pair` была сброшена

//println!("копия: {:?}", moved_pair);

// ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку

// Полученный результат из .clone() все ещё можно использовать!

println!("клон: {:?}", cloned_pair);

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

В Rust нет "наследования", но вы можете объявить трейт, который будет надмножеством для другого. Например:

trait Person {

fn name(&self) -> String;

}

// `Student` - супертрейт для `Person`.

// Реализация `Student` требует, чтобы вы также реализовали и `Person`.

trait Student: Person {

fn university(&self) -> String;

}

trait Programmer {

fn fav_language(&self) -> String;

}

// `CompSciStudent` (студент факультета информацики) - супертрейт для `Programmer`

// и `Student`. Реализация `CompSciStudent` требует реализации обоих подтрейтов.

trait CompSciStudent: Programmer + Student {

fn git_username(&self) -> String;

}

fn comp_sci_student_greeting(student: &dyn CompSciStudent) -> String {

format!(

"Меня зовут {} и я посещаю {}. Моё имя в Git {}",

student.name(),

student.university(),

student.git_username()

)

}

fn main() {}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Глава "The Rust Programming Language" о супертрейтах

Тип может реализовывать много разных трейтов. Что если два трейта будут требовать метод с одним и тем же именем? например, много трейтов могут иметь метод get(), которые так же могут иметь разные возвращаемые типы!

Хорошие новости: благодаря тому, что каждая реализация трейта имеет собственный impl-блок, становится яснее для какого трейта мы написали метод get.

А что будет, когда придёт время вызвать эти методы? Чтобы устранить неоднозначность, мы можем использовать полное имя метода (Fully Qualified Syntax).

trait UsernameWidget {

// Получить из виджета имя пользователя

fn get(&self) -> String;

}

trait AgeWidget {

// Получить из виджета возраст

fn get(&self) -> u8;

}

// Форма, реализующая оба трейта: и `UsernameWidget`, и `AgeWidget`

struct Form {

username: String,

age: u8,

}

impl UsernameWidget for Form {

fn get(&self) -> String {

self.username.clone()

}

}

impl AgeWidget for Form {

fn get(&self) -> u8 {

self.age

}

}

fn main() {

let form = Form{

username: "rustacean".to_owned(),

age: 28,

};

// Если вы раскомментируете эту строку, вы получите ошибку, которая говорит

// "multiple `get` found". Потому что это, в конце концов, несколько методов

// с именем `get`.

// println!("{}", form.get());

let username = <Form as UsernameWidget>::get(&form);

assert_eq!("rustacean".to_owned(), username);

let age = <Form as AgeWidget>::get(&form);

assert_eq!(28, age);

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה