Читаем Rust на примерах полностью

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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

<p id="Супертрейты"><strong><a l:href="#Супертрейты">Супертрейты</a></strong></p>

В 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

<p id="Смотрите_также_56"><strong><a l:href="#Смотрите_также_56">Смотрите также:</a></strong></p>

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

<p id="Устранение_неоднозначности_в_перекрывающихся_трейтах"><strong><a l:href="#Устранение_неоднозначности_в_перекрывающихся_трейтах">Устранение неоднозначности в перекрывающихся трейтах</a></strong></p>

Тип может реализовывать много разных трейтов. Что если два трейта будут требовать метод с одним и тем же именем? например, много трейтов могут иметь метод 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()

}

}

Перейти на страницу:

Похожие книги

Компьютерные сети. 6-е изд.
Компьютерные сети. 6-е изд.

Перед вами шестое издание самой авторитетной книги по современным сетевым технологиям, написанное признанным экспертом Эндрю Таненбаумом в соавторстве со специалистом компании Google Дэвидом Уэзероллом и профессором Чикагского университета Ником Фимстером. Первая версия этого классического труда появилась на свет в далеком 1980 году, и с тех пор каждое издание книги неизменно становилось бестселлером. В книге последовательно изложены основные концепции, определяющие современное состояние компьютерных сетей и тенденции их развития. Авторы подробно объясняют устройство и принципы работы аппаратного и программного обеспечения, рассматривают все аспекты и уровни организации сетей — от физического до прикладного. Изложение теоретических принципов дополняется яркими, показательными примерами функционирования интернета и компьютерных сетей различного типа. Большое внимание уделяется сетевой безопасности. Шестое издание полностью переработано с учетом изменений, произошедших в сфере сетевых технологий за последние годы, и, в частности, освещает такие технологии, как DOCSIS, 4G и 5G, беспроводные сети стандарта 802.11ax, 100-гигабитные сети Ethernet, интернет вещей, современные транспортные протоколы CUBIC TCP, QUIC и BBR, программно-конфигурируемые сети и многое другое.

Дэвид Уэзеролл , Ник Фимстер , Эндрю Таненбаум

Учебные пособия, самоучители