Введение
В этом лабораторном задании мы узнаем, что в Rust можно использовать предложение where для выражения ограничений для обобщенных типов отдельно от их объявления, что позволяет получить более ясный синтаксис, и можно также применять ограничения к произвольным типам, а не только к параметрам типа. Предложение where особенно полезно, когда ограничения более выразительны, чем обычный синтаксис, как показано в примере, связанном с треитом PrintInOption.
Примечание: Если лабораторное задание не задает имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать
main.rs, скомпилировать и запустить его с помощьюrustc main.rs &&./main.
Предложения where
Ограничение также можно выразить с помощью предложения where сразу перед открывающейся фигурной скобкой {, а не при первом упоминании типа. Кроме того, предложения where могут применять ограничения к произвольным типам, а не только к параметрам типа.
Некоторые случаи, когда предложение where полезно:
- Когда указание обобщенных типов и ограничений отдельно является более понятным:
impl <A: TraitB + TraitC, D: TraitE + TraitF> MyTrait<A, D> for YourType {}
// Выражение ограничений с помощью предложения `where`
impl <A, D> MyTrait<A, D> for YourType where
A: TraitB + TraitC,
D: TraitE + TraitF {}
- Когда использование предложения
whereболее выразительно, чем использование обычного синтаксиса.implв этом примере не может быть напрямую выражено без предложенияwhere:
use std::fmt::Debug;
trait PrintInOption {
fn print_in_option(self);
}
// Поскольку в противном случае нам пришлось бы выразить это как `T: Debug` или
// использовать другой метод косвенного подхода, для этого требуется предложение `where`:
impl<T> PrintInOption for T where
Option<T>: Debug {
// Мы хотим, чтобы `Option<T>: Debug` было нашим ограничением, потому что именно это
// выводится. В противном случае мы будем использовать неправильное ограничение.
fn print_in_option(self) {
println!("{:?}", Some(self));
}
}
fn main() {
let vec = vec![1, 2, 3];
vec.print_in_option();
}
Резюме
Поздравляем! Вы завершили лабораторную работу по предложениям where. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.