Предложение where
Предложение where используется для указания ограничений
на обобщённые типы. Оно позволяет вынести условия, которым
должны соответствовать типы, из угловых скобок в отдельную
часть сигнатуры. Параметрами предложения where являются
ограничения вида T: Trait, которые должны выполняться
для успешной компиляции функции, метода или реализации.
Синтаксис
fn function_name<T>(value: T)
where
T: Trait,
{
// body
}
Пример
Давайте рассмотрим функцию, которая принимает значение
обобщённого типа и выводит его на экран. Ограничение
T: Display зададим через предложение where:
use std::fmt::Display;
fn print_value<T>(value: T)
where
T: Display,
{
println!("{}", value);
}
fn main()
{
print_value(12345);
print_value("abcde");
}
Результат выполнения кода:
12345
"abcde"
Пример
Давайте применим предложение where сразу с несколькими
ограничениями для функции, которая складывает два числа
и выводит результат:
use std::fmt::Display;
use std::ops::Add;
fn add_and_print<T>(a: T, b: T)
where
T: Add<Output = T> + Display + Copy,
{
let res = a + b;
println!("{}", res);
}
fn main()
{
add_and_print(1, 2);
add_and_print(3.5, 4.5);
}
Результат выполнения кода:
3
8
Пример
Предложение where можно использовать не только
в функциях, но и в реализациях трейтов. Давайте создадим
свой трейт Printable и реализуем его для обобщённого
типа с ограничением:
use std::fmt::Display;
trait Printable
{
fn print(&self);
}
impl<T> Printable for T
where
T: Display,
{
fn print(&self)
{
println!("{}", self);
}
}
fn main()
{
let res = 12345;
res.print();
"abcde".print();
}
Результат выполнения кода:
12345
"abcde"
Смотрите также
-
трейт
trait,
который определяет общее поведение для типов -
конструкция
trait bound,
которая задаёт ограничения на обобщённые типы -
конструкция
impl for,
которая реализует трейт для конкретного типа -
конструкция
dyn trait,
которая создаёт типаж-объект для динамической диспетчеризации