バイナリツリーを実装します。Rcでバイナリツリーを実装するときに不変の借用したコンテンツを変更可能なものとして借りることはできません
error: cannot borrow immutable borrowed content as mutable
--> so.rs:31:9
|
31 | root.insert_left(&left);
| ^^^^
error: aborting due to previous error
私はここで間違っているものを理解することはできません:私はコンパイルエラーを持っている
use std::rc::Rc;
struct Node {
left: Option<Rc<Node>>,
right: Option<Rc<Node>>,
data: String,
}
impl Node {
fn new(_data: String) -> Node {
Node {
data : _data.clone(),
left : None,
right : None,
}
}
fn insert_left(&mut self, mut node: &Rc<Node>) {
self.left = Some(node.clone());
}
fn insert_right(&mut self, mut node: &Rc<Node>) {
self.left = Some(node.clone());
}
}
fn main() {
let mut root = Rc::new(Node::new(String::from("root")));
let mut left = Rc::new(Node::new(String::from("left")));
root.insert_left(&left);
}
:コードはおそらく慣用錆はありませんが、次のコードをコンパイルするように、私の主な言語はC++です。いくつかの試行錯誤の反復の後で、私は問題がinsert_left()
関数にあることを発見しました。self
が不変参照であれば、それはコメントアウトされた内容でコンパイルされますが、不変の参照は私の目標を達成できません。ここで
あなたは[** 23の他の質問と同じエラーメッセージ**]を見ましたか(http://stackoverflow.com/search?q=is%3Aq+cannot+borrow+immutable+borrowed+content+as +変更可能)? *これらの質問と異なる点は何ですか?関連性が高いと思われる[Rustのツリー内のノードを変更する](http://stackoverflow.com/q/28008585/155423)というタイトルもあります。 (質問メーリングリストからの努力は大変です)(http://meta.stackoverflow.com/q/261592/155423)、少なくとも同じエラーメッセージとデータ構造を持つ他の質問を見つけることは最低限のようです。 – Shepmaster
慣用錆については、変数 '_data'を呼ぶべきではありません。先行するアンダースコアは、未使用の変数*を示すために使用されます。その変数は非常に多く使われています。 – Shepmaster
@Shepmaster関数を構築するための入力引数のためのより良い規則は何ですか? – Alex