Poniższy kod kompiluje i działa poprawnie:Dlaczego Rust nie rozpoznaje, że zmienną jest i str?
use std::fmt::Display;
fn display(x: &str) {
println!("{}", x);
}
fn main() {
let s: &str = "hi there";
display(s);
}
Jeśli jednak zmienić funkcję display
być
fn display(x: &Display)
To daje następujący błąd:
src/main.rs:9:13: 9:14 error: the trait `core::marker::Sized` is not implemented for the type `str` [E0277]
src/main.rs:9 display(s);
Zmieniając display(s)
do display(&s)
znowu działa.
Co się tutaj dzieje? Oczywiście typ to &str
, ale gdy &Display
jest argumentem wejściowym, nie rozpoznaje tego.
Uwaga: &34
również działa jako argument w porządku. Czy to dlatego, że Display
jest faktycznie zaimplementowany dla &str
, a nie str
?
Dlaczego 'display (& s)' działa? Sądzę, że to jest odwołanie do "grubego" odniesienia? Czy są inne typy, które są "grubymi" recenzentami, czy też są w jakiś sposób wyjątkowe? – vitiral
Chyba nie rozumiem, dlaczego 'str' nie jest po prostu strukturą z danymi i długością, zamiast' & str'? Wtedy '& str' nie byłby już grubszym wskaźnikiem i nie mielibyśmy tego problemu! – vitiral
Poszukałem grubych wskazówek i to był całkiem dobry odnośnik: https://www.reddit.com/r/rust/comments/38tv6n/when_is_a_reference_not_a_pointer/ Będę badać ... – vitiral