Ключевое слово impl

Реализации функциональности для типа или типа, реализующего некоторую функциональность.

Существует два варианта использования ключевого слова impl:

  1. Блок impl — это элемент, используемый для реализации некоторой функциональности для типа.
  2. 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.