以下のコードがコンパイルされ、正常に動作:なぜRustは変数が&strであることを認識しませんか?
use std::fmt::Display;
fn display(x: &str) {
println!("{}", x);
}
fn main() {
let s: &str = "hi there";
display(s);
}
あなたは
fn display(x: &Display)
するdisplay
機能を変更した場合しかし、それは次のエラー与える:display(s)
を変更することにより
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);
をdisplay(&s)
に戻ります。
ここでは何が起こっていますか?明らかに型は&str
ですが、&Display
が入力引数である場合、その型は認識されません。
注:&34
も引数として有効です。これはDisplay
が実際に&str
に実装されていて、str
では実装されていないためですか?
なぜ 'display(&s)'は動作しますか?私はそれが "脂肪"参照へのレフェリーだと思いますか? "fat"参照型か、何らかの理由で '&str'型である他の型がありますか? – vitiral
私はなぜ 'str'が'&str'の代わりにデータと長さを持つ構造体ではないのか分かりません。それで '&str'はもはや太ったポインタにならなくなり、この問題は起こりません! – vitiral
私はファットポインターを見て、これはかなり良いリファレンスでした:https://www.reddit.com/r/rust/comments/38tv6n/when_is_a_reference_not_a_pointer/私は調査を続けます... – vitiral