提示:记录一下学习rust的一点理解,如有错误请指出,谢谢!
rust 中使用 & 与 Box 的区别
rust 中使用 & 与 Box 的区别
Box
可以获取变量的所有权,而 &
获取的是变量的引用
- &:发生的是借用
#[derive(Debug)]
enum Node<'a> {
Cons(i32, &'a Node<'a>),
Nil,
}
use Node::{Cons, Nil};
fn main() {
let node1 = Cons(11, &Nil);
let node2 = Cons(22, &node1);
let node3 = Cons(33, &node2);
let a = Cons(12, &node3);
println!("{:?}", a); // Cons(12, Cons(33, Cons(22, Cons(11, Nil))))
println!("{:?}", node1); // Cons(11, Nil)
println!("{:?}", node2); // Cons(22, Cons(11, Nil))
println!("{:?}", node3); // Cons(33, Cons(22, Cons(11, Nil)))
}
- Box: 发生的是移动
#[derive(Debug)]
enum Node{
Cons(i32, Box<Node>),
Nil
}
use Node::{Cons, Nil};
fn main() {
let node1 = Cons(11, Box::new(Nil));
let node2 = Cons(22, Box::new(node1));
let node3 = Cons(33, Box::new(node2));
let a = Cons(12, Box::new(node3));
println!("{:?}", a);
println!("{:?}", node1);
println!("{:?}", node2);
println!("{:?}", node3);
}
// 26 | let node1 = Cons(11, Box::new(Nil));
// | ----- move occurs because `node1` has type `Node`, which does not implement the //`Copy` trait
// 27 | let node2 = Cons(22, Box::new(node1));
// | ----- value moved here
//...
// 32 | println!("{:?}", node1);
// | ^^^^^ value borrowed here after move