rust 学习梳理

数据类型

  • 基于已明确的类型,Rust会推断剩下大部分类型。基于类型推断Rust具备了与动态类型语言近似的易读性,并仍能在编译期捕获类型错误。
  • 函数可以是泛型的:单个函数ujiu可以处理不同类型的值。
  • Rust的类型根基是一组固定宽度的数值类型,匹配几乎所有现代处理器直接硬件实现的类型。固定宽度可能丢失精度(u8 u16 u32 u64 u128 usize[有符号同理],f32,f64)
  • usize 和 isize是与目标机器地址空间保持一致
  • bool类型在rust用整字节表示
  • 字符类型用32位来表示单个Unicode字符
  • 元组类型中,每个元素有不同的类型;元组中只能用常量索引其中元素(t.1)。常用于在函数中返回多个值。可以用作一个小巧的结构体类型。
  • 指针类型:Rust有多种可以表示地址的类型(引用,Box,裸指针)
  • Rust的引用永远不会为空,Rust会跟踪值的所有权和生命周期,在编译器排除了悬空指针、双重释放、指针失效等错误。
  • Rust的引用分为不可变和可变。
  • Box是分配在堆上的引用类型。
  • 裸指针是不安全的,Rust不会跟踪它指向的内容。只能在Unsafe块中对裸指针解引用。
  • Rust用三种类型表示值序列(数组,向量,切片)
  • 数组是相同类型,确定大小的序列,不能追加或缩小。向量(vector)是动态分配可增长的相同类型的序列,元素存在堆中。切片是引用了数组或向量的一部分。
  • 切片是任意长度,对切片的应用是一个胖指针,双字值,包括第一个元素的指针和切片中元素的数量。
  • 函数以切片引用为参数,可以给它传入向量或数组,很多向量和数组的方法都是在切片上定义的。&[T]。可以使用范围值获取数组或向量一段区域(&a[2..6])
  • 字符串原始表达:r"/root/ddd"。
  • 可以在字符串前加入原始记号#,可以根据需求增加多个#来表示原始字符串开始与结束(r###“this is a raw string ### "也可以是原始字符",结束了"###)
  • 字节串是用b表示:b"abcd",这是一个u8类型的数组。字节串不能包含unicode字符,只能用ascii和\xHH转义序列。
  • 在内存中,字符串都是unicode字符,由于是可变字节编码,所以或占用多个字节。ascii编码会存储在一个字节中。
  • &str很像&[T],而String类似与Vec

String

创建String的方法

  1. .to_string() 将&str转换为String。这会复制字符串。.to_owned()会做同样的事情,只是命名风格适用与另一些类型
  2. format!()会返回一个新的String.
  3. 字符串的数组,切片和向量都有的两个方法:.concat()和.join(sep)。会形成新的String

所有权和生命周期

在Rust中,所有权是语言本身的特性,通过编译器强制检查执行。每个值斗殴与决定其生命的唯一拥有者,当拥有者被释放时,它拥有的值也同时被释放,rust中叫做丢弃。

凡是超出作用域的类型,它所拥有的值将被抛弃。

拥有者与它拥有的那些值形成了一课树,每棵树的总根都是一个变量,当该变量超出作用域时,整棵树都会随之消失。

  • 可以将值从一个拥有者转移给另一个拥有。这允许构建,重新排列和拆除树形结构。
  • 整数、浮点数、字符、bool类型的简单类型,不受所有权规则约束,这些被称为Copy类型
  • 标准库提供了引用计数指针类型 Rc和Arc,允许值在某些限制下有多个拥有者。
  • 可对值进行借用,获得值的引用。这种引用是非拥有型指针,有受限生命周期

移动

变量的赋值,传递给函数,或者函数返回,这样的操作会带来所有权的移动,也就是由目标变量来获得值的控制权,获得新的生命周期,构建新的所有权树。

而源变量将会变为未初始化状态,无法被使用。

从一个Vec中获得某一个string,直接取值会报错,没有实现Copy trait。建议是访问其中的元素使用引用而不是移动它。

如果真的要从Vec取出一个字符串,但Rust是不会将Vec的某一个元素设置为未初始化状态。因此需要一些操作:

  1. 从vec弹出一个值:v.pop()
  2. 指定索引处与最后一个值互换,把前者移出:v.swap_remove(1)
  3. 取出一个值与另一个值互换:std::mem::replace(&mut v[2],"abcdefg".to_string())

移出一个Option,将其与None互换: std::mem::replace(&mut v[2],None)。实际上专门提供了一个方法实现:v[2].take()。

对于Copy类型,移动就是复制值。

在Rust中,每次移动都是字节级别的一对一浅拷贝,并让源变为未初始化。只有那些可以通过简单复制位来复制其值的类型才能作为Copy类型,任何在丢弃时需要做特殊操作的类型都不能是Copy类型。

共享所有权

rc和arc(线程安全)。Rust的内存和线程安全保证:确保不会有任何值是既共享又可变。Rc和Arc是不可变共享引用。

引用

Rust 学习笔记的更多相关文章

  1. Rust学习笔记1

    这是一份不错的rust教程,目前包括4个block和4个project.全部完成后可以用rust实现一个简单的key-value存储引擎. 注意:Windows下rust貌似会遇到一些bug,强烈建议 ...

  2. Rust学习笔记一 数据类型

    写在前面 我也不是什么特别厉害的大牛,学历也很低,只是对一些新语言比较感兴趣,接触过的语言不算多也不算少,大部分也都浅尝辄止,所以理解上可能会有一些偏差. 自学了Java.Kotlin.Python. ...

  3. Rust学习笔记2

    继续继续... 转眼都开学啦... Building Blocks 2 building blocks里讲了一些关于Log structure storage的东西,这也是用于在硬盘上持久化KvSto ...

  4. Rust学习之旅(读书笔记):枚举 (Enum)

    Rust学习之旅(读书笔记):枚举 (Enum) C 语言的枚举类型很弱,不如后来的语言,也不如之前的语言.在 C 语言里面枚举量就是一个名字,更方便的定义常量.今天读了<The Rust Pr ...

  5. 《Rust权威指南》学习笔记——4. 认识所有权

    Rust权威指南学习笔记--认识所有权 什么是所有权 1. 所有权规则 Rust中的每一个值都有一个对应的变量作为它的所有者. 在同一时间内,值有且仅有一个所有者. 当所有者离开自己的作用域时,它持有 ...

  6. Rust 学习之旅(7):Package,Crate,Module

    Rust 学习之旅(7):Package,Crate,Module 这是第 7 章的读书笔记,Cargo Workspace 在第 14 章. Packages and Crates As a pro ...

  7. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  8. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  9. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  10. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

随机推荐

  1. mpi转以太网Plus模块连接300PLC实现MPI转modbus通信

    西门子200/300PLC转以太网同时实现PPI/MPI/DP转modbus通信 产品简介 MPI-ETH-XD1.0plus是在MPI-ETH-XD1.0的基础上,以太网口增加了支持与西门子带网口P ...

  2. math 库中常用的数学运算和常量【GO 基础】

    〇.关于 math GO 语言的 math 库是一个内置的标准库,其中包含了许多数学函数和常量,用于计算各种数学运算和统计学计算. 日常开发中,计算当然是少不了的,那么今天来梳理下备查. 一.测试示例 ...

  3. C++的动态分派在HotSpot VM中的重要应用

    众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持 ...

  4. 其它-Supervisor的使用

    文章目录 Supervisor 的使用 一 Supervisor介绍 二 安装 2.1 安装方式 2.2 验证 2.3 配置 2.4 配置详情(了解) 2.5 启动.停止.重启 三 program 配 ...

  5. Linux系列教程——Linux基本权限、Linux特殊权限、LinuxACL控制、Linux输入输出

    @ 目录 1 Linux基本权限 1.权限基本概述 1.什么是权限? 2.为什么要有权限? 3.权限与用户之间的关系? 4.权限中的rwx分别代表什么含义? 2.权限设置示例 1.为什么要设定权限,我 ...

  6. oj练习题 数字 eval 整数 int ???

    s = input()if 'hello world!' == s.casefold(): print("Yes")else: print("No") A+B问 ...

  7. Java-网络编程(TCP-UDP)

    Java-网络编程(TCP-UDP) 网络基础 网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的.中间最主要 ...

  8. PHP-FFMpeg 操作音视频

    目录 安装PHP-FFMpeg 视频中提取一张图片 视频中提取多张图片 调整视频大小 视频添加水印 生成音频波形 音频转换 给音频添加元数据 拼接多个音视频 截取音视频 提取 gif 动图 裁剪视频 ...

  9. 2023 版 Java和python开发线性代数探索

    目录 前景提示 需求 分析 1.初始化不需要指定矩阵的尺寸,并且可以直接传入数据. 2.可以计算2x2矩阵的逆 3.可以做2x2的矩阵乘法 Java版本开发 一. 开发详情 1.开发一个子类,如图所示 ...

  10. 轻松合并Excel工作表:Java批量操作优化技巧

    摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在Excel中设计表单时,我们经常需要对收集的信息进行统 ...