2016-10-09 7 views
1

この質問はおそらく基本的なものですが、私は何を検索するべきかを知りません。 私は本の中で私に飛び出した何を見ていない、と私は錆の初心者だ:変更可能で不変なデータアクセス

struct Node; 
impl Node { 
    fn children(&mut self) -> &mut Vec<Node> { 
     // Pulls a field out of Node, to be mutated 
    } 
    fn next_node(&self) -> Node { 
     // Produces a new value using values computed from self. 
     // Doesn't hold a reference to self 
    } 
} 
[...] 
if self.children().len() > K { 
    let mut next_node = self.next_node(); 
    let list = self.children(); 
    // something involving next_node and list 
} 

これは私が最終的に私がやったことは良かったという錆を納得させるようになったものです。 は、私はもっとストレートフォワードたが見つかりました:

let list = self.children(); 
if list.len() > K { 
    let mut next_node = self.next_node(); 
    // Something involving next_node and list 
} 

しかし、真実であるself.childrenにまで開催された可変1は、すでにあったので、私はnext_nodeselfへの不変の参照を取得できませんでしたので、それが訴えました。

特にこの実装では、私は.children()を1回だけ実行します。この場合、これは非常に複雑な方法ではありませんが、可能性があります。

childrenは複数回計算されません。不要な場合はnext_nodeを作成しないでください。

答えて

1

簡単な答え:なし。あなたがmutably場を借りて、その後場を借りて、それがあまりにも長い間、両方が同じコンテキスト(関数/メソッド)で発生するよう、うまくいくことができますので、借りたときに錆がばらばら分野について推論することができます


この場合、next_nodeはコンパイラに対して不透明であり、私たちが知っているすべてのものを実際に使用している可能性があります。

したがって、next_nodeを呼び出すときには、変更可能な借用が未処理である必要があります。この実装では特に


私はこのケースでは非常に複雑な方法ではありませんが、することができた、かつて.children()を行います。

真...このメソッドの役割は何ですか?なぜそれはの両方を実行するのですか大量の計算借用?

  • が可能

として小さなとしてスコープの

  • ボローを一度高価な計算を行う(借りていない)、それが働くだろう:

    このコードのシンプルな編成は次のようになります:

    self.expensive_computation(); 
    
    if self.children.len() > K { 
        let mut next_node = self.next_node(); 
        let list = self.children; 
        // Something involving next_node and list 
    } 
    
  • 関連する問題