Изучение этих двух концепций поможет укрепить ваше понимание того, как работает Rust и как вы можете реализовать функции ООП.

Трейты и время жизни являются ключевыми компонентами Rust. Черты можно использовать для определения поведения и возможностей реализуемых типов. Они очень универсальны, позволяя вам писать более общий код, уменьшать дублирование и улучшать ремонтопригодность.

Rust использует другой механизм — время жизни — для отслеживания прав собственности на переменные в области видимости и вне ее. Это предотвращает висячие указатели во время освобождения переменных.

Вместе трейты и время жизни помогают обеспечить безопасность типов, безопасность памяти и надежность кода.

Понимание трейтов в Rust

Черты — это наборы методов, которые могут быть реализованы другими типами. Черты похожи на интерфейсы на таких языках, как Java, Go и TypeScript, но более гибкие.

Вы будете использовать черта ключевое слово для определения трейтов в Rust, за которым следует объявление сигнатур методов.

чертаMyTrait {
фнмой_метод(&себя);
}

Код определяет черту с именем MyTrait с мой_метод метод. &себя указывает, что метод ссылается на объект реализующего типа в качестве своего первого параметра.

После определения признака вы можете реализовать его для своих пользовательских типов.

Вот как вы можете реализовать трейт для ваших типов структур.

структураЧеловек {
имя: Нить,
возраст: U32,
}

импл Информация для Человек {
фнкраткое содержание(&себя) {
распечатать!(«Меня зовут {}, мне {} лет»., себя.имя, себя.возраст);
}
}

Человек структура реализует Информация, и вы можете позвонить в краткое содержание метод на экземплярах Человек структура.

фносновной(){
позволять Джон = Человек { имя: Нить::от("Джон"), возраст: 30 };
john.summary(); // Вывод: Меня зовут Джон, мне 30 лет.
}

Джон переменная является экземпляром Человек структура.

основной вызовы функций краткое содержание который выводит сообщение на консоль:

Перечисления могут реализовывать трейты. Вот как вы можете определить перечисление с вариантами, которые реализуют краткое содержание метод:

перечислениеMyEnum {
Вариант А,
Вариант Б,
}

импл Информация для MyEnum {
фнкраткое содержание(&себя) {
соответствоватьсебя {
MyEnum:: ВариантА => {
// реализация для VariantA
}
MyEnum:: VariantB => {
// реализация для VariantB
}
}
}
}

Использование признаков для параметров функций и возвращаемых значений

Вы можете использовать трейты в качестве параметров функции и возвращаемых значений. Использование трейтов в качестве параметров функций удобно для написания универсального кода с несколькими типами.

Вот функция, которая принимает параметр любого типа, который реализует Информация.

фнсделай что-нибудь(значение: Т) {
значение.резюме();
}

синтаксис указывает, что Т должен реализовать Информация. Вы можете позвонить в краткое содержание функция с любым значением, которая реализует Информация.

Время жизни в Rust

Инструмент Rust для проверки заимствований анализирует программы и обеспечивает правильное использование памяти. В ржавчине у каждой ценности есть владелец который отвечает за освобождение значения. Когда переменные заимствуют значения, они заимствуют ссылку на переданное значение, но владелец сохраняет право собственности.

Сроки жизни — это способ убедиться, что заимствованные значения используются правильно. Срок действия — это метка, прикрепленная к ссылке, описывающая, как долго ссылка действительна.

В Rust вы можете указать время жизни, используя аннотацию с апострофом:

функция<а>

При создании ссылки ей назначается время жизни, которое описывает, как долго она действительна. Если у вас есть функция, которая принимает ссылку на значение, время жизни должно быть больше, чем вызов функции, чтобы гарантировать, что значение действительно, когда функция возвращается.

Вот пример спецификации времени жизни в функции.

фнсделай что-нибудь<а>(х: &аi32) -> &аi32 {
Икс
}

фносновной() {
позволять х = 42;
позволять результат = сделать_что-то(&x);
распечатать!("Результат: {}", результат);
}

в сделай что-нибудь функция, а параметр времени жизни указывает, что ссылка на Икс действует до тех пор, пока вызывается функция. Возвращаемая ссылка также действительна до тех пор, пока выполняется вызов функции.

основной функция выводит результат, передавая ссылку на Икс переменная в основной функцию на консоль.

Синтаксис времени жизни может быть многословным, но он важен для безопасности и управления памятью. Правила исключения с тремя сроками жизни предоставляют рекомендации, которые позволяют Rust делать выводы о времени жизни ссылок в определенных ситуациях.

Правило жизненного цикла ввода

Правило времени жизни ввода указывает, что если функция или метод принимает одну или несколько ссылок в качестве входных параметров, Rust предполагает, что все ссылки имеют одинаковое время жизни.

Проще говоря, время жизни выходных ссылок будет таким же, как и у входных ссылок.

фнсамый длинный<а>(х: &аул, г: &аул) -> &аул {
если х.лен() > у.лен() { х } еще {у}
}

в самый длинный функция, Rust делает вывод, что время жизни выходной ссылки такое же, как и входной ссылки, потому что они обе имеют одинаковый параметр времени жизни. а.

Правило времени жизни ввода упрощает написание универсальных функций, принимающих несколько ссылок в качестве входных данных.

Правило продолжительности вывода

Правило времени жизни вывода указывает, что если функция или метод возвращает ссылку, Rust будет считать, что время жизни выходной ссылки отличается от времени жизни любой входной ссылки.

фнпервое слово<а>(с: &аул) -> &аул {
s.split_whitespace().next().unwrap()
}

В этой функции Rust делает вывод, что время жизни выходной ссылки отличается от времени жизни входной ссылки, потому что split_whitespace() метод создает выходную ссылку, которая не принимает входных параметров ссылки.

Правило исключения жизней

Правило исключения времени жизни применяется, если функция или метод принимает одну ссылку или входной параметр и возвращает ссылку. В этом случае Rust предполагает, что выходная ссылка имеет то же время жизни, что и входная ссылка.

фнсамый длинный<а>(х: &аул, г: &ул) -> &аул {
если х.лен() > у.лен() { х } еще {у}
}

В этой функции Rust делает вывод, что время жизни выходной ссылки такое же, как и время жизни входной ссылки, потому что входная ссылка у не имеет параметра времени жизни. Rust пропускает параметр времени жизни для у и предполагает, что он имеет тот же срок службы, что и Икс.

Это правило упрощает написание функций, которые принимают одну входную ссылку и возвращают одну выходную ссылку.

Черты и продолжительность жизни

Вы можете комбинировать трейты и времена жизни для создания универсальных функций, которые работают с типами, которые реализуют трейты и имеют допустимое время жизни.

Вот трейт и функция, которая ссылается на значение, реализующее трейт.

чертаНанизывать {
фннанизывать(&себя) -> Нить;
}

фннанизывать<а, Т: Нанизывать>(т: &а Т) -> Нить {
t.to_string()
}

Здесь параметр времени жизни а гарантирует, что ссылка т действителен в течение всего времени существования объекта, на который он ссылается. Вы можете использовать нанизывать функция с типами, которые реализуют Нанизывать признак, имеющий действительное время жизни.

Черты формируют основу для реализации концепций ООП в Rust

Черты позволяют вам определять поведение. Хотя Rust не является объектно-ориентированным языком программирования (ООП), вы можете использовать трейты для реализации концепций ООП от инкапсуляции до наследования, полиморфизма и абстракции.

Реализация этих концепций ООП с трейтами делает ваши программы на Rust масштабируемыми, надежными, удобными в сопровождении и эффективными.