2017-01-02 12 views
0

をより長く存続するために失敗すると書いて私は、元のツリーが破壊されるので、関数が返したときに、その左回転が原因lifetime parameter contravarianceのそれよりも長持ちすることができないことを理解左回転は左回転で木を交換する機能を、私は平衡二分探索木を実装しようとしてるオリジナル

error: borrowed value does not live long enough 
    --> bst.rs:18:27 
    | 
18 |     l: Some(& BST {l: self.l, r: y.l}), 
    |       ^^^^^^^^^^^^^^^^^^^^^^^ temporary value created here 
19 |     r: y.r 
20 |    } 
    |    - temporary value only lives until here 
    | 
note: borrowed value must be valid for the lifetime 'a as defined on the block at 7:36... 
    --> bst.rs:7:37 
    | 
7 |  fn left_rotate(self) -> BST<'a> { 
    |         ^

:次のエラーでrustc bst.rs結果を使用してこの例をコンパイルします。私の意図は、関数が元のツリーを消費して、左のローテーションが元のツリーが持つ関数が呼び出されていなかった寿命を継承するように、左のローテーションを返すことでした。これは錆で可能ですか?そうでない場合は、ツリー置換をサポートするという私の目標を達成する最も単純なデザインは何ですか?私の好みは、Rust標準ライブラリに頼るのを避け、自分自身の寿命を管理することを学ぶことです。

私はRustの生涯に関する経験が不足していますのでご了承ください。私の背景知識は、ほとんどがC++やMLスタイルの言語です。

+0

* * 'rustc bst.rs'を使用して - 私は** **強く貨物を使用してお勧めしたいです。基本的に 'rustc'を直接使う理由はほとんどありません。 – Shepmaster

+0

も参照してください[関数で作成された変数への参照を返す方法はありますか?](http://stackoverflow.com/q/32682876/155423)、問題の根本です。 – Shepmaster

答えて

4

参考までに間違っています。

C++によく似ているが、Rustにはポインタと参照がある:ポインタは所有しており、参照は借りている。

あなたは&'a BST<'b>を持っている場合は、それ:

  • は、少なくとも同じ長'a
  • 'b限り、少なくとも住んでいる何かが含まれているとして住んでいるどこかのメモリ内 BST<'b>への参照であり、しかし、ここで

、:

  • BSTを参照したくない場合は、それらを所有したい
  • あなたのBSTには参照する必要があるものは何も含まれていません。彼らは、ペイロードがなければ、かなり無意味です。

何が本当に欲しいのです:

struct BST { 
    l: Option<Box<BST>>, 
    r: Option<Box<BST>> 
} 

impl BST { 
    fn left_rotate(self) -> BST { 
     match self.r { 
      None => self, 
      Some(mut y) => { 
       BST { 
        l: Some(Box::new(BST {l: self.l, r: y.l.take()})), 
        r: y.r.take() 
       } 
      } 
     } 
    } 
} 
関連する問題