我目前正在学习Rust中的所有权和borrow ,以及如何在没有borrow 的情况下使用同一个变量执行两次函数,就像这个例子中的那样,它不会编译

enum Computer{
    Desktop,
    Laptop,
}

fn print_type_of_computer(num: Computer){
    match num {
        Computer::Desktop => println!("this is a desktop"),
        Computer::Laptop => println!("this is a laptop"),
    }
}

fn main() {
    let myComputer :Computer = Computer::Laptop;
    print_type_of_computer(myComputer);
    print_type_of_computer(myComputer);
}

然而,当我try 这个代码时,它运行得很好,即使没有borrow

fn get_double(num: i32){
    println!("{:?}", num * 2);
}

fn main() {
    let mynum :i32 = 3;
    get_double(mynum);
    get_double(mynum);
}

我希望有人能解释一下,为什么第一种情况不接受代码,而第二种情况却接受了

推荐答案

i32实现Copy,因此在这种情况下,数据实际上被复制到函数中.这意味着不是将原始数据的所有权传递到get_double,而是传递该数据的副本.

Computer不能实现Copy,所以必须borrow .

Rust相关问答推荐

定义采用更高级类型泛型的性状

为什么铁 rust S似乎有内在的易变性?

告诉Rust编译器返回值不包含构造函数中提供的引用

避免在Collect()上进行涡鱼类型的涂抹,以产生<;Vec<;_>;,_>;

我可以在不收集或克隆的情况下,将一个带有Item=(key,val)的迭代器拆分成单独的key iter和val iter吗?

如何从ruust中的fig.toml中读取?

如何将单个 struct 实例与插入器一起传递到Rust中的映射

为什么实现特征的对象期望比具体对象有更长的生命周期?

仅发布工作区的二进制 crate

Button.set_hexpand(false) 不会阻止按钮展开

如何将 &[T] 或 Vec<T> 转换为 Arc<Mutex<[T]>>?

如何使用 Rust Governor 为每 10 秒 10 个请求创建一个 RateLimiter?

是否可以通过可变引用推进可变切片?

在给定 Rust 谓词的情况下,将 Some 转换为 None 的惯用方法是什么?

在 FFI 的上下文中,未初始化是什么意思?

我如何将特征作为 struct 的拥有字段?

使用 `.` 将 T 转换为 &mut T?

提取 struct 生成宏中字段出现的索引

在 Rust 中有条件地导入?

守卫如何影响匹配语句?