Rust 基础知识总结

rust · 浏览次数 : 0

小编点评

## Rust所有权规则概述 Rust 中的每一个值都有一个所有者,值在任一时刻有且只有一个所有者。当所有者离开作用域时,其对应的值被丢弃。 1. **值的移动(Move)**:当一个变量被赋值给另一个变量时,原变量将不可用,除非该值为编译时已知大小的类型(如整型)或实现了 `Copy` trait 的类型。对于这些类型,原变量在被赋值给新变量后仍然可用。 - 原变量在被移动后变为只读状态,对其的任何修改都会导致编译错误。 - 原变量在移动后被丢弃,新变量取得了原变量的值和所有权。 2. **编译时不确定大小的类型**:这些类型的值存储在堆上。当一个变量被赋给其他值后,原变量将被不可用,并且被移动。因此,这些类型的变量在原地是不可用的。 - 这些类型的变量通常用作参数或返回值,因为它们在调用前后保持不变。 3. **所有权与函数原理**:函数参数的传递方式与变量赋值类似,都是通过值传递,即将实参的值复制给形参。 - 在函数内部对参数所做的任何修改都不会影响到实参,因为实参只是拷贝了一份参数的值。 4. **所有权与返回值**:函数的返回值遵循与变量赋值相同的规则。当函数返回一个值时,这个值的拷贝会被丢弃。 - 函数内的变量通常用来计算或保存中间结果,而不是作为输出参数。 5. **引用与借用**:引用(`&`)不拥有值,因此不涉及所有权。引用是通过借用(`borrow`)获得的,这意味着在引用有效期内,它指向的值不能被移动。 - 可变引用(`&mut`)允许修改被引用的值,但仍然不涉及所有权问题,因为引用本身没有实际控制权。 - 不可变引用(`&`)则不允许修改被引用的值,因为它们只持有值的引用,而不是实际的值本身。 6. **sliceslice(切片)**:由于切片是一个不可变的引用,它实际上并不拥有所引用的内存区域的所有权。然而,在某些情况下,切片可能包含指向底层数据的指针,这种情况下就需要仔细处理所有权和生命周期的问题。 总的来说,Rust的所有权规则旨在确保在编程时不会出现数据竞争和悬垂引用等错误。所有权的规则帮助开发者理解哪些操作是允许的,哪些会导致编译错误或者运行时错误。

正文

一、所有权规则:

  1. Rust中的每一个值都有一个所有者(Owner)
  2. 值在任一时刻有且只有一个所有者;
  3. 当所有者(变量)离开作用域时,其对应的值被丢弃;

 

二、Move(转移)

  1. 原变量被赋值给其他变量以后,原变量不可用;编译时已知大小的类型除外;如整型;
  2. Copy trait; 如果一个值实现了Copy trait; 那么旧的变量在将其赋值给其他变量以后,仍然可用; 如 数字类型的变量;该规则,打破了所有权转移规则;
  3. 编译时已知大小的类型,都实现了Copy trait
  4. 编译时已知大小的类型,其值存储在栈上;
  5. 编译时已知大小的类型,其值不会被Move;而是被Copy;故而原变量仍然可用;
  6. 编译时不确定大小的类型,其值存储在堆上;变量被赋给其它值后,原变量被不可用,被Move了;

 

三、所有权与函数

原理同变量赋值;

 

四、所有权与返回值

原来同变量赋值;

 

五、引用&与借用

  1. 引用不拥有值;故而,引用没有所有权;
  2. 将创建一个引用的行为称为借用(borrowing);
  3. 引用于可变引用与不可变引用
  4. 可以同时拥有多个不可变引用
  5. 只能有一个可变引用
  6. 有可变引用的同时,不能有不可变引用
  7. 悬垂引用,Rust 编译器确保不会有悬垂引用;因为当你拥有一个数据的引用时;编译器会确保数据不会在引用之前离开作用域;

 

六、slice

  1. slice 是一种不可变引用,故而其没有所有权;

与Rust 基础知识总结相似的内容:

Rust 基础知识总结

一、所有权规则: Rust中的每一个值都有一个所有者(Owner); 值在任一时刻有且只有一个所有者; 当所有者(变量)离开作用域时,其对应的值被丢弃; 二、Move(转移) 原变量被赋值给其他变量以后,原变量不可用;编译时已知大小的类型除外;如整型; Copy trait; 如果一个值实现了Cop

文盘Rust —— rust连接oss | 京东云技术团队

对象存储是云的基础组件之一,各大云厂商都有相关产品。这里跟大家介绍一下rust与对象存储交到的基本套路和其中的一些技巧。

[转帖]NGINX 局限太多,Cloudflare 最终放弃它并用 Rust 自研了全新替代品

https://www.infoq.cn/news/s2fa603MsEENsCmibTYI 长期以来,NGINX 可以说是网站安全和托管服务提供商 Cloudflare 的核心,是其所使用的基础软件的一部分。 “Cloudflare 将 NGINX 用于其提供的所有 Web 服务,并在世界各地的数

Rust 错误处理

rust 处理错误,不使用 try catch, 而是使用 Result。 简单的处理rust错误 在各种关于rust错误处理的文档中,为了解释清楚其背后的机制,看着内容很多,不好理解。 比如我们写一个方法,读取文件内容: fn read_file_to_string(file_path

Rust性能分析之测试及火焰图,附(lru,lfu,arc)测试

好的测试用例及性能测试是对一个库的稳定及优秀的重要标准,尽量的覆盖全的单元测试,能及早的发现bug,使程序更稳定。

Rust中的并发性:Sync 和 Send Traits

在并发的世界中,最常见的并发安全问题就是数据竞争,也就是两个线程同时对一个变量进行读写操作。但当你在 Safe Rust 中写出有数据竞争的代码时,编译器会直接拒绝编译。那么它是靠什么魔法做到的呢? 这就不得不谈 Send 和 Sync 这两个标记 trait 了,实现 Send 的类型可以在多线程

[转帖]Rust在windows下安装以后cargo build Error: linker `link.exe` not found

D:\rust\runoob-greeting\greeting>cargo build error: linker `link.exe` not found | = note: 系统找不到指定的文件。 (os error 2) note: the msvc targets depend on th

[转帖]wiki Rust

Rust[编辑] 维基百科,自由的百科全书 跳到导航跳到搜索 此条目介绍的是由Mozilla主导开发的编程语言。关于“rust”在英文中的本意,请见“铁锈”。关于由Facepunch工作室所开发的一款游戏,请见“腐蚀 (游戏)”。 Rust 编程范型 编译语言、并发计算、函数式、指令式、面向对象、结

文盘Rust -- 把程序作为守护进程启动

当我们写完一个服务端程序,需要上线部署的时候,或多或少都会和操作系统的守护进程打交道,毕竟谁也不希望shell关闭既停服。今天我们就来聊聊这个事儿。 最早大家部署应用的通常操作是 “nohup xxxx &”,别说像weblogic 或者其他java 容器有启动脚本,里面其实也差不多;很喜欢 ngi

文盘Rust -- r2d2 实现redis连接池

作者:贾世闻 我们在开发应用后端系统的时候经常要和各种数据库、缓存等资源打交道。这一期,我们聊聊如何访问redis 并将资源池化。 在一个应用后端程序访问redis主要要做的工作有两个,单例和池化。 在后端应用集成redis,我们主要用到以下几个crate:​ ​once_cell​​​、​ ​re