所有权与函数

  1. fn main() {
  2. let s = String::from("hello");
  3. takes_ownership(s); //s的值移动到函数里
  4. let x = 5; //x进入作用域
  5. makes_copy(x); //x应该移动到函数里,但是i32是copy,所以后面可以继续使用x。
  6. println!("x is {}",x);
  7. //下面这句编译会出错, ^ value borrowed here after move
  8. //println!("s is {}",s);
  9. }
  10. fn takes_ownership(some_string:String){
  11. println!("{}",some_string);
  12. } //some_string离开作用域并调用drop方法。占用的内存释放
  13. fn makes_copy(some_integer: i32) {
  14. println!("{}",some_integer);
  15. }

返回值与作用域

  1. fn main() {
  2. let s1 = gives_ownership(); //函数返回值some_string移动给s1
  3. let s2 = String::from("hello"); //s2进入作用域
  4. let s3 = take_and_give_back(s2); //s2移动但函数,然后移交给s3。最终只有s3有效
  5. }
  6. fn gives_ownership() -> String {
  7. let some_string = String::from("hello");
  8. some_string //因为some_string是String类型,所以这里做移动操作
  9. }
  10. fn take_and_give_back(a_string: String) -> String {
  11. a_string
  12. }

引用的使用

  1. //为了能够返回函数的值以及其值的一些属性,我们可以使用引用
  2. //类似go的指针吧,只获取值不获取所有权。
  3. fn main() {
  4. //因为默认不允许修改引用的值,所以加mut。
  5. let mut s = String::from("hello world");
  6. //let s1 = &mut s;
  7. //但是要注意:在特定作用域中的特定数据有且只有一个可变引用。
  8. //s1已经引用了,s2就不能再用,避免了数据竞争
  9. //let s2 = &mut s;
  10. // println!("{}", s1);
  11. //可以使用大括号来创建一个新的作用域,s1和s2的作用域不同。
  12. {
  13. let s1 = &mut s;
  14. println!("s1 {}", s1);
  15. }
  16. let s2 = &mut s;
  17. println!("s2{}", s2);
  18. // change(&mut s);
  19. }
  20. // fn change(some_string: &mut String){
  21. // some_string.push_str(",world");
  22. // }

注意:同一个区域不允许可变和不可变引用同时存在例如下面这样

  1. let mut s = String::from("hello world");
  2. let s1=&s;
  3. let s2=&s;
  4. //println("{},{}",s1,s2); //s1,s2调用之后失效,下面的可变引用s3才能生效。
  5. let s3=&mut s;

rust所有权的更多相关文章

  1. Rust所有权语义模型

    编程语言的内存管理,大概可以分为自动和手动两种. 自动管理就是用 GC(垃圾回收)来自动管理内存,像 Java.Ruby.Golang.Elixir 等语言都依赖于 GC.而 C/C++ 却是依赖于手 ...

  2. Rust所有权及引用

    Rust 所有权和借用 Rust之所以可以成为万众瞩目的语言, 就是因为其内存安全性. 在以往内存安全几乎全都是通过GC的方式实现, 但是GC会引来性能.CPU以及Stop The World等问题, ...

  3. 对Rust所有权、借用及生命周期的理解

    Rust的内存管理中涉及所有权.借用与生命周期这三个概念,下面是个人的一点粗浅理解. 一.从内存安全的角度理解Rust中的所有权.借用.生命周期 要理解这三个概念,你首要想的是这么做的出发点是什么-- ...

  4. Rust <4>:所有权、借用、切片

    tips:栈内存分配大小固定,访问时不需要额外的寻址动作,故其速度快于堆内存分配与访问. rust 所有权规则: 每一个值在任意时刻都有且只有唯一一个所有者 当所有者离开作用域时,这个值将被丢弃 所有 ...

  5. 最强肉坦:RUST多线程

    Rust最近非常火,作为coder要早学早享受.本篇作为该博客第一篇学习Rust语言的文章,将通过一个在其他语言都比较常见的例子作为线索,引出Rust的一些重要理念或者说特性.这些特性都是令人心驰神往 ...

  6. Rust之路(4)——所有权

    [未经书面同意,严禁转载] -- 2020-10-14 -- 所有权是Rust的重中之重(这口气咋像高中数学老师 WTF......). 所有权是指的对内存实际存储的数据的访问权(包括读取和修改),在 ...

  7. Rust中的所有权,引用和借用

    这个有意思,指针解释获新生!!! fn main() { let mut s = String::from("hello"); s.push_str(", world!& ...

  8. Rust语言的多线程编程

    我写这篇短文的时候,正值Rust1.0发布不久,严格来说这是一门兼具C语言的执行效率和Java的开发效率的强大语言,它的所有权机制竟然让你无法写出线程不安全的代码,它是一门可以用来写操作系统的系统级语 ...

  9. Rust: move和borrow

    感觉Rust官方的学习文档里关于ownship,borrow和lifetime介绍的太简略了,无法真正理解这些语法设计的原因以及如何使用(特别是lifetime).所以找了一些相关的blog来看,总结 ...

随机推荐

  1. MySQL语法顺序及执行顺序

    一.书写顺序 select[distinct] from join on where group by having union order by limit 二.执行顺序 from on join ...

  2. python中format函数用于字符串的格式化

    python中format函数用于字符串的格式化 通过关键字 print('{名字}今天{动作}'.format(名字='陈某某',动作='拍视频'))#通过关键字 grade = {'name' : ...

  3. float与position间的区别

    float与position间的区别:    个人理解为:脱离文档流不一定脱离文本流:但脱离文本流,则也脱离文档流.[如有更好的理解还望评论区一起探讨,共同学习进步]一.float 浮动(脱离文档流, ...

  4. 关于创建Web图像时应记住的五个要素

    1. 格式与下载速度 当前,Web上用的最广泛的三种格式是GIF.PNG和JPEG.我们的目标是选择质量最高,同时文件最小的格式. WebP图像格式 谷歌建立了另一种图像格式,名为WebP. 这种格式 ...

  5. 使用cmd命令行登录mysql并查看mysql状态

    直接上代码,打开cmd命令窗口,进入mysql的安装目录(例如:cd  D:/lnmp/bin/mysql/mysql5.7.11/bin)输入: #mysql -u root -p Enter pa ...

  6. 笔谈kxmovie开源播放器库的使用

    开源播放器项目 kxmovie(https://github.com/kolyvan/kxmovie),现在仍然是很多刚开始接触播放器开发的程序员的参照范本.以下是我操作kxmovie项目的过程: ( ...

  7. logstash multiple piplines 配置方式

    当logstash有很多个input类型需要处理时.为了更方便的管理,我们需要使用一个.conf(input->filter->output)配置文件来对应一个pipeline. pipl ...

  8. 【HICP Gauss】数据库 数据库管理(文件 用户管理 系统权限 对象权限 profile)-7

    数据库运行 依赖不同类型的文件 ,数据文件 参数文件 控制文件 redo日志文件 运行日志文件 审计日志文件等 数据文件 就是表空间文件 存储数据库的数据文件 参数文件 用户修改的配置信息 控制文件 ...

  9. NGINX状态模块的使用

    nginx状态模块可以用来查看当前nginx服务器的并发量和总的请求数 启用nginx的状态模块 状态模块需要在编译安装的时候启用. 1.下载nginx源码包 2.安装nginx并启用模块 3.修改n ...

  10. JS中的this、apply、call、bind(经典面试题)

    1.什么是this 在JavaScript中this可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式,this 绑定的对象即函数执行的上下文环境(context). 为了帮助理解,让我 ...