并非所有变量都已绑定 什么原因_Rust:所有权和借用

它们是什么,我们如何使用它们?

5e3dd4be0682beb6ab97aea1a4b4e72f.png

> Photo by Amy Hirschi on Unsplash

我正在学习Rust,并做了一些关于所有权和借用概念的注释。

请注意,我在同时"与Rust借阅检查器打架"的同时仍然要牢记这些概念……

Rust的所有权

所有权=值与变量的绑定/关联。 规则是:

· 一次仅一个所有者。

· 如果绑定被"释放",则所有权"消失",数据被"释放"。

let p1 = Person::new(); //1p2 = p1; //2let p1 = Person::new();do_something(p1); //out of scope

在第2行,p1将被释放。 由于已将所有权转移到p2,因此超出范围。 将p1传递给另一个函数也具有相同的效果。

let p1 = Person::new();p2 = p1;println!("person {#:?}", p2)println!("person {#:?}", p1) //compile error

这就是Rust不允许您再次使用该值的原因。 它在编译时使用借阅检查器强制执行此操作。

Drop

如果需要自定义清除逻辑,则可以从Drop特性中实施drop方法。 当该值超出范围时,Rust将自动调用它

一旦超出范围,即放弃所有权,Rust编译器将不允许您再次使用它,因为它需要"释放"。 这也称为移动,即将p1的所有权移至p2。

所有权仅适用于堆数据,不适用于栈数据,因为它(堆栈数据)是"复制"的,而不是"移动的"。

复制

复制特征允许复制值。 所有原始类型(例如i32,bool等)都隐式实现了Copy。

如果自定义类型的所有组件也都实现了复制,则自定义类型(例如结构)可以实现复制。 要实现,您可以使用#[derive(Copy)]或使用显式实现

所有权转让方式

并使编译器满意。

· 使用clone()方法。

· 从函数返回。

· 通过引用。

· 传递可变引用。

使用clone()

可以将其视为类似于深层复制的操作,在该操作中,它会在堆上创建数据的单独副本,并将新所有者指向该副本,而使旧值保持不变(或不变)。

某些类型默认实现Clone特质(例如String),但是您可以使用#[derive(Clone)]将自定义类型标记为可克隆。

let p1 = Person::new();let p2 = p1.clone();do_something(p2);println!("{:?}, p1); //works ok

从函数返回

let p1 = Person::new();do_something(p1);...fn do_something(p: Person) -> Person {  //logic}...println!("p = {}",p1); //continue using p1 since ownership has been passed back

但是,这很奇怪! 您被迫返回某些内容仅仅是因为您希望将变量保留在范围内

通过引用

let p1 = Person::new();do_something(&p1);println!("p = {}",p1); //continue using p1 since ownership has been was never passed on...fn do_something(p: &Person) {  //logic}...

p1的值没有移动-这称为借用。 do_something从未获得所有权,因为我们所做的只是传递了对p1的引用-请注意&。

可变引用

如果您希望do_something逻辑更新Person引用的名称,则需要传递一个可变的引用。

let mut p1 = Person::new();do_something(&mut p1);println!("mutated info {}",p2)...fn do_something(p: &mut Person, new_name: String) {   p.name = String::from(new_name);}...

变化:

· 变量p1被声明为mut(可变)。

· 将&mut传递给do_something而不是&-表示可变引用。

· do_something签名已更新为&mut-表示可变引用。

结论

要进一步研究,您可以阅读The Rust Programming Language一书中的以下章节。

· 第四章所有权和借用

· 第十章生命周期

· 第十五章智能指针

(本文翻译自Abhishek Gupta的文章《Rust: Ownership and Borrowing》,参考:https://medium.com/better-programming/rust-ownership-and-borrowing-9cf7f081ade0)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值