Руст черта граничит с типами - PullRequest
0 голосов
/ 02 мая 2020

Я читал исходный код hyperium / http и нашел this :

pub fn put<T>(uri: T) -> Builder
 where
    Uri: TryFrom<T>,
    <Uri as TryFrom<T>>::Error: Into<crate::Error>,

{
    Builder::new().method(Method::PUT).uri(uri)
}   

В этом фрагменте Uri является типом и T универсальный c элемент. Я всегда видел конструкцию where T: SomeTrait, но не SomeType: SomeTrait<T>. Есть ли у этой конструкции имя и задокументировано ли это где-нибудь?

1 Ответ

1 голос
/ 02 мая 2020

Цитирование https://doc.rust-lang.org/reference/trait-bounds.html#higher -ranked-traits-bounds :

При использовании элемента должны быть соблюдены границы для элемента. При проверке типа и проверке заимствования элемента generi c границы могут использоваться для определения того, что признак реализован для типа. Например, учитывая Ty: Trait

В теле функции generi c методы из Trait можно вызывать для значений Ty. Также можно использовать связанные константы в Trait. Можно использовать связанные типы из Trait. Generi c функции и типы с границами T: Trait могут использоваться с Ty, используемым для T.

Ничто не говорит о том, что Ty является параметром типа (а не фиксированный тип). Так что я бы сказал, что это просто черта характера, хотя и не так часто встречающаяся в руководствах по Rust.

...