【发布时间】:2016-12-08 17:08:05
【问题描述】:
我想实现一棵二叉树。我的主要语言是 C++,所以代码可能不是惯用的 Rust,而是编译以下代码:
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);
}
我有编译错误:
error: cannot borrow immutable borrowed content as mutable
--> so.rs:31:9
|
31 | root.insert_left(&left);
| ^^^^
error: aborting due to previous error
我不明白这里有什么问题。经过一些尝试错误的迭代,我发现问题出在insert_left() 函数中:如果self 是不可变引用,那么它会使用注释掉的内容进行编译,但不可变引用不允许我实现目标。
【问题讨论】:
-
你看过23 other questions with the same error message吗? this 问题与其他问题有何不同?甚至还有一个标题为Changing a node in a tree in Rust,看起来非常相关。大量的effort is expected from question askers,至少找到具有相同错误消息和数据结构的其他问题似乎是最低限度的。
-
对于惯用的 Rust,你不应该调用你的变量
_data。前导下划线用于表示未使用的变量。该变量非常常用。 -
@Shepmaster 构造函数的输入参数的更好约定是什么?
-
总的来说,Rust 中的变量阴影没有什么问题。但是,这里没有出现阴影;只需调用它
data就可以了。请记住,当用户浏览您的文档时,该名称也会向用户显示。
标签: rust