РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
547 of 1245 menu

Предложение 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,
    которая создаёт типаж-объект для динамической диспетчеризации
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить