变量大小编译时必须已知

除了在结构体、枚举的递归定义时会碰到,在函数定义时,这个规则也能体现出来 — 函数的参数大小也必须在编译时已知:

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);