私はRustのドキュメントでこのコードを見ました:
fn eat(&self) {
println!("{} is done eating.", self.name);
}
&
in &self
意味ですか?
これは、オブジェクト自体を移動するのではなく、オブジェクトへの参照を渡すことを意味します。関数を次のようにした場合、これを区別するためにインポートします。
fn eat(self) {
println!("{} is done eating.", self.name);
}
そして、あなたはそれを呼び出した後、変数を使用して、エラーが発生します
object = Foo::new();
object.eat();
object.something(); // error, because you moved object in eat
&
を指定しない場合、Rustは値を関数に移動し、元のバインディングには所有権がなくなります。私が作成したこの最小限の例を確認してください( 遊び場バージョン ):
struct Foo {
x : u32
}
impl Foo {
fn eat(self) {
println!("eating");
}
fn something(&self) {
println!("else");
}
}
fn main() {
println!("Hello, world!");
let g = Foo { x: 5 };
g.eat();
g.something(); // if this comes before eat, no errors because we arent moving
}
ここで、something
をbeforeeat
と呼ぶように切り替えます。 something
は参照のみを取るため、g
は引き続き所有権を持ち、続行できます。一方、eat
はg
に移動し、g
を使用できなくなります。