2016-04-10 4 views
3

私は寿命に関するRustのドキュメントを読んでいます。 fun(self)方法はsインスタンスの所有権を取るためです実装はいつRustで自己の所有権を取得したいですか?

<anon>:16:5: 16:6 error: use of moved value: `s` [E0382] 
<anon>:16  s.print(); 
      ^
<anon>:16:5: 16:6 help: see the detailed explanation for E0382 
<anon>:15:5: 15:6 note: `s` moved here because it has type `S`, which is non-copyable 
<anon>:15  s.fun(); 

:私は次のエラーを取得する

struct S { 
    x: i8, 
} 

impl S { 
    fn fun(self) {} 

    fn print(&self) { 
     println!("{}", self.x); 
    } 
} 

fn main() { 
    let s = S { x: 1 }; 
    s.fun(); 
    s.print(); 
} 

:私のようなものを試してみました。これはfun(&self)に変更することで解決します。

なぜオブジェクト上のメソッドを自分自身で制御する必要があるのか​​わかりません。私は1つの例しか考えられませんが、destructorメソッドですが、オブジェクトを破棄したい場合は、オブジェクトの所有者が処理します(この例ではmainのスコープ)。

私の質問:なぜ構造体の所有権を取得するメソッドを書くことが可能ですか?あなたがこれを望む状況がありますか?

+1

*私はデストラクタメソッドの1つしか考えられません* - 面白いことに、[デストラクタに最も近い](http://doc.rust-lang.org/std/ops/trait.Drop.html)変更可能な参照によって項目を取得します。 – Shepmaster

答えて

6

錆びた文書の自己を「制御する」方法を指す慣用句は、それを「消費する」と言うことです。これをグーグル場合は、実際にいくつかの例を見つけることができます:あなたはIterator::mapを書き換えてみてくださいすることができます:あなたが希望理由としてhttps://doc.rust-lang.org/std/iter/trait.Iterator.html

Iterator特性で

+0

賢い、ありがとう。 – Joe

4

タイプAからタイプBへの変換には、一般に、値によって自己を取る関数が含まれます。具体的な例については、IntoおよびFrom形質の実装者を参照してください。

+0

ありがとうございました!意味をなさない – Joe

関連する問題