用整数类型解释Rust所有权概念

22-10-07 banq

对于实现了Copy特性的类型,如i32,使用起来就容易多了。
(String默认是值传递,不是引用传递,也不是值复制,但是i32类型是值复制)

让我们从简单的东西开始:
我们创建age并调用do_something。这里,age的值被复制了,因为i32类型实现了复制特性。

fn main() {
    let age: i32 = 25;
    do_something(age);
}

fn do_something(age: i32) {
    println!("Hello, {}!", age);
}


在第4行中再次复制了年龄的值。

fn main() {
    let age: i32 = 25;
    do_something(age);
    println!("{}", age);
}

fn do_something(age: i32) {
    println!("Hello, {}!", age);
}


我们也可以通过引用来传递数值,尽管我认为这不是最佳实践。

fn main() {
    let age: i32 = 25;
    do_something(&age);
    println!("{}", age);
}

fn do_something(age: &i32) {
    println!("Hello, {}!", age);
}


也可以使用克隆(原型模式
在第 3 行中,我们首先进行了克隆age,然后将其传递给do_something. 程序会编译,但请注意复制将进行两次:一次在.clone() 中,另一个是当age进入do_something作用域时的复制。
请注意,应避免使用此坏味道用法。请参阅此处的clone_on_copy 上的 Clippy lint 。

fn main() {
    let age: i32 = 25;
    do_something(age.clone());
    println!("{}", age);
}

fn do_something(age: i32) {
    println!("Hello, {}!", age);
}