铁锈随记
变量大小编译时必须已知
除了在结构体、枚举的递归定义时会碰到,在函数定义时,这个规则也能体现出来 — 函数的参数大小也必须在编译时已知:
fn from_array(array: [i32]) -> LinkedList {
// ... 省略 ...
}
编译器会给出错误信息:
the size for values of type `[i32]` cannot be known at compilation time
doesn't have a size known at compile-time
help: the trait `std::marker::Sized` is not implemented for `[i32]`
这是因为编译时,编译器需要知道函数参数的大小,才能分配足够的内存空间保存传入的参数值。
因此,可以传入一个引用作为参数,因为引用类型(普通用引用符号,或者盒子、切片、字符串等类型)大小是已知的。
这个例子里,通常的做法是用切片类型(&[i32]
)代替数组作为参数。
对于盒子变量所有权的变更小例
(https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4b9cedc559697d0dffe63b430952e3ee)
let mut a = Box::new(Person { name: String::from("dave") });
let b = Box::new(*a); // a's value owner moved to b
// cannot use a here
// println!("{:?}", a); // compiler error!
// but a can be assigned new value
a = Box::new(Person { name: String::from("qpy") });
println!("{:?}", a);
println!("{:?}", b);