Я смотрел на черту Borrow<Borrowed>
в Rust, и я понимаю идею, что мы хотим, чтобы обобщенная c функция позволяла аргументу K
или его заимствованной форме Q
такую, что K: Borrow<Q>
. Если я посмотрю на реализацию String
, то обнаружу, что она реализует Borrow<str>
, что объясняет, почему передача &String
работает в следующем фрагменте. Что меня интересует, так это то, как может работать &str
: это означает, что str
реализует ... Borrow<str>
? Если нет, то как str
может удовлетворить черты данного P
generi c?
use std::borrow::Borrow;
use std::fmt::Display;
fn main() {
let foo = String::from("I'm a String");
print(&foo);
print("I'm a str");
}
fn print<P>(arg: &P)
where
P: Borrow<str> + ?Sized + Display
{
println!("{}", arg)
}