首先,要搞清楚栈内存和堆内存对应了那些类型。rust的整型、浮点型、bool型、字面字符串型和tuple型都是栈内存上的;如果使用=,那么这些数据会拷贝一份新的内容。

然后,要了解rust的变量作用域,这点直接参考C++的即可。

最后给出Owership的规则:

  • rust的每个值都有对应的变量名,这个变量名是owner
  • 每个值同时只能有一个owner
  • 当owner离开作用范围时,值会被释放掉。

String在rust中是堆内存的内容,堆内存中的内容如果使用=,那么默认是使用移动语义的,移动语义直接参考C++的std::move即可。给出代码实例说明:

fn main() {let str = "hello";let s1 = String::from(str);println!("s1 = {}", s1);let s2 = s1;println!("s2 = {}", s2);// println!("s1 = {}", s1);  // 直接调用是错误的,此时s1堆内存的owner已经是s2了
}

实际在内存中发生的情景

和C++的移动语义一样,内存中实际的控制权被转换到了s2中了,s1此时已经是空的了。

如果我们想要s1任然有效,那么可以通过克隆的方式,比如:

let s1 = String::from("hello");
let s2 = s1.clone();

在函数使用的时候,尤其要注意这个问题,给出代码实例:

fn main() {let str = String::from("hello world !");takes_ownership(str);// println!("str = {}", str);  // 直接调用会报错,因为已经被移动了let str1 = String::from("hello world !");takes_ownership(str1.clone());  // 可以安全调用,因为使用了clone了println!("str1 = {}", str1);
}fn takes_ownership(some_string: String) {  // 一旦调用,外界的String所有权会被移动到这里println!("takes_ownership(): {}", some_string);
}

上述代码中,takes_ownership函数在调用后,原来的String内容会被销毁,如果不想销毁,可以使用一个trick:

fn main() {let str = String::from("hello world !");let str1  = takes_ownership(str);println!("str1 = {}", str1);
}fn takes_ownership(some_string: String) -> String {  // 一旦调用,外界的String所有权会被移动到这里println!("takes_ownership(): {}", some_string);some_string
}

函数内部使用expression的方式返回即可

rust笔记2 OwnerShip基础概念相关推荐

  1. 机器学习入门 笔记(二) 机器学习基础概念

    第二章 机器学习基础概念 1.机器的数据 2.机器学习的主要任务 3.监督学习和非监督学习 4.批量.在线学习.参数.非参数学习 5.哲学思考 6.环境的搭建 1.机器的数据 我们以鸢尾花的数据为例. ...

  2. [云炬python3玩转机器学习笔记] 2-1机器学习基础概念

    机器学习基础概念 一.关于数据 本文约定: 大写表示矩阵 小写表示向量 上标代表第几个样本 下标代表第几个特征 一般向量都表示为列向量 特征空间:每个维度都可以表示一个特征,形成一个空间(2D,3D, ...

  3. GIS地图学习笔记一之基础概念

    要做GIS地图的开发,我们需要先了解GIS地图相关的概念. 相关概念可以在这里了解-->ArcGIS 帮助库 本文是从上述网站中学习,摘抄的. 基础概念 地理信息系统 (GIS) 是以可视化和分 ...

  4. Python笔记002-Python编程基础概念

    第二章(1):Python编程基础概念 1. Python 程序的构成 Python 程序有模块组成.一个模块对应 Python 源文件,一般后缀名是:.py. 模块有语句组成.运行 Python程序 ...

  5. rust笔记8 collections基础

    vec基础 具体细节在代码中,注意引用的技巧,一般使用get()获取元素,这样如果越过边界,返回的是None. fn main() {let v = vec![1, 2, 3, 4, 5];let x ...

  6. 精通正则表达式笔记一---正则表达式基础概念[ ],[^ ],.,^,$,\<,\>,|,(),-

    学习过程中,可以到这篇文章推荐的网站进行正则表达式的练习.点击这里 正则表达式是一种思想--各种工具以各种方式来实现它.如果理解了正则表达式的基本思想,掌握就是易如反掌的事情. 弄明白"如何 ...

  7. 燃料电池发动机控制问题研究——系统分析与建模(文献阅读笔记)-1、基础概念认识

    1.燃料电池发电机----(当燃料电池系统用于给车辆做动力源时的称呼) 燃料电池堆+燃料电池辅助系统 燃料电池发动机辅助系统包括氢气供应系统.空气供应系统.循环水系统(水热平衡系统)和控制系统. 文献 ...

  8. 精通正则表达式笔记二---正则表达式基础概念?,+,*,{ },\,“ “,时间,小结

    2 可选项元素 2.1 ? 现在来看color和colour的匹配.它们的区别在于,后面的单词比前面的多一个u,我们可以用colou?r来解决这个问题.元字符?(也就是问号)代表可选项.把它加在一个字 ...

  9. 【学习笔记】JSON基础概念简介

    JSON是什么? JSON即JavaScript Object Notation,是Javascript对象原生的一种表现形式.它是一种轻量级的.纯文本的,用来存储.传递和交货文本信息的格式. JSO ...

最新文章

  1. asp网上书店系统_Asp.net Core启动流程讲解(一)
  2. 细思极恐的2016智能交通!怎么回事?
  3. (转)CSS样式表继承详解
  4. Java 8 Date-Time API 详解
  5. SAP财务报表不平之分析
  6. Edge Cache(边缘缓存) 的概念
  7. java中Scanner类中 next()与nextLine()的区别
  8. 如何免费注册Coursera课程
  9. 技术分享丨数据仓库的建模与ETL实践技巧
  10. 当SQLServer判断不等于遇到null的时候
  11. Mac OS X 11中的/usr/bin 的“Operation not permitted”
  12. FME SERVER介绍
  13. 统一异常处理ControllerAdvice
  14. 汇编语言程序设计技巧详解(附例题)
  15. 天宇优配|利好太多,写不下了!A股港股全线走高,股民嗨了
  16. 三十三.智能驾驶之多传感器融合技术: AVOD融合方法
  17. MATLAB绘图:导出矢量图
  18. 个人学习笔记——庄懂的技术美术入门课(美术向)06
  19. matlab绘制函数傅里叶,MATLAB中如何实现矩形函数的傅里叶变换
  20. 施耐德PM5350电度表电能数据解析

热门文章

  1. redis key失效的事件_Redis常见、常用的知识点
  2. 更新卡片的zIndex
  3. STL中algorithm里的查找
  4. Git用户签名设置,用户级别
  5. MySQL 事务控制语句(TCL)
  6. struts2学习笔记(二) 初识Struts2
  7. Mac下SSH Key配置
  8. javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转换为YUV、BGR24或RGB24等图像像素数据...
  9. node.js提供的服务器live-server的使用
  10. [POJ3096]Surprising Strings