Ключевое слово impl
Реализации функциональности для типа или типа, реализующего некоторую функциональность.
Существует два варианта использования ключевого слова impl:
- Блок
impl— это элемент, используемый для реализации некоторой функциональности для типа. impl Traitв позиции типа может использоваться для обозначения типа, который реализует трейт с именемTrait.
Реализация функциональности для типа
Ключевое слово impl в первую очередь используется для определения реализаций для типов. Внутренние реализации (inherent implementations) являются самостоятельными, в то время как реализации трейтов (trait implementations) используются для реализации трейтов для типов или других трейтов.
Реализация состоит из определений функций и констант. Функция, определённая в блоке impl, может быть самостоятельной (standalone), что означает, что она будет вызываться как Vec::new(). Если функция принимает self, &self или &mut self в качестве первого аргумента, она также может быть вызвана с использованием синтаксиса вызова метода — знакомой возможности для любого объектно-ориентированного программиста — например, vec.len().
Внутренние реализации (Inherent Implementations)
#![allow(unused)] fn main() { struct Example { number: i32, } impl Example { fn boo() { println!("boo! Example::boo() was called!"); } fn answer(&mut self) { self.number += 42; } fn get_number(&self) -> i32 { self.number } } }
Не имеет большого значения, где определена внутренняя реализация; её функциональность находится в области видимости везде, где находится её реализующий тип.
Реализации трейтов (Trait Implementations)
#![allow(unused)] fn main() { struct Example { number: i32, } trait Thingy { fn do_thingy(&self); } impl Thingy for Example { fn do_thingy(&self) { println!("doing a thing! also, number is {}!", self.number); } } }
Не имеет большого значения, где определена реализация трейта; её функциональность может быть внесена в область видимости путём импорта трейта, который она реализует.
Для получения дополнительной информации о реализациях см. книгу по Rust или Справочник.
Обозначение типа, который реализует некоторую функциональность
Другое использование ключевого слова impl — в синтаксисе impl Trait, который можно понимать как «любой (или некоторый) конкретный тип, который реализует Trait». Он может использоваться как тип объявления переменной, в позиции аргумента или в позиции возврата. Один уместный случай использования — работа с замыканиями, которые имеют неназываемые типы.
#![allow(unused)] fn main() { fn thing_returning_closure() -> impl Fn(i32) -> bool { println!("here's a closure for you!"); |x: i32| x % 3 == 0 } }
Для получения дополнительной информации о синтаксисе impl Trait см. книгу по Rust.