`Str` реализует` Borrow <str>`? - PullRequest
1 голос
/ 14 марта 2020

Я смотрел на черту 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)
}

1 Ответ

2 голосов
/ 14 марта 2020

Да, вы можете легко найти в do c

impl<T> Borrow<T> for T where T: ?Sized, 

Это означает, что для любого типа T, Borrow<T> реализовано для T. where T: ?Sized означает, что T может иметь динамический размер. Если признак «связанный» (больше ослабления здесь) where T: ?Sized не был добавлен, то T не будет включать типы динамического размера, такие как str или другие типы срезов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...