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. 【RocketMQ】事务实现原理总结

    RocketMQ事务的使用场景 单体架构下的事务 在单体系统的开发过程中,假如某个场景下需要对数据库的多张表进行操作,为了保证数据的一致性,一般会使用事务,将所有的操作全部提交或者在出错的时候全部回滚 ...

  2. 低功耗引擎 Cliptrix 有什么价值

    在万物互联的时代,现代人已普遍接受电视.音箱等电器设备具备智能化能力,也是在这个趋势下,我们身边越来越多的iOT设备联网和交互成为刚需.但iot设备也面临到一些非常显著的痛点,例如iot设备的内存.处 ...

  3. 聊聊基于Alink库的决策树模型算法实现

    示例代码及相关内容来源于<Alink权威指南(Java版)> 概述 决策树模型再现了人们做决策的过程,该过程由一系列的判断构成,后面的判断基于前面的判断结果,不断缩小范围,最终推出结果. ...

  4. Redis系列之——Redis介绍安装配置

    文章目录 第一章 redis初识 1.1 Redis是什么 1.2 Redis特性(8个) 1.3 Redis单机安装 1.3.1下载安装 1.3.2三种启动方式 1.3.2.1 最简启动 1.3.2 ...

  5. 【Azure Function App】Python Function调用Powershell脚本在Azure上执行失败的案例

    问题描述 编写Python Function,并且在Function中通过 subprocess  调用powershell.exe 执行 powershell脚本. import azure.fun ...

  6. solidity入门

    1. solidity 简介 Solidity(中文名称:Solidity 语言)是一种面向智能合约(Smart Contracts)的高级编程语言,最初由以太坊(Ethereum)的团队开发并用于以 ...

  7. Caused by: liquibase.exception.ValidationFailedException: Validation Failed:1 change sets check sum

    db/changelog/mysql/changelog-0001-307096-1.0.sql::1.0::buoluo.meng was: 8:a5d8f616a121230c204fd2b878 ...

  8. 黄金眼PAAS化数据服务DIFF测试工具的建设实践

    一.背景介绍 黄金眼PAAS化数据服务是一系列实现相同指标服务协议的数据服务,各个服务间按照所生产指标的主题作划分,比如交易实时服务提供实时交易指标的查询,财务离线服务提供离线财务指标的查询.黄金眼P ...

  9. 数据结构与算法 | 二分搜索(Binary Search)

    二分搜索(Binary Search) 文承上篇,搜索算法中除了深度优先搜索(DFS)和广度优先搜索(BFS),二分搜索(Binary Search)也是最基础搜索算法之一. 二分搜索也被称为折半搜索 ...

  10. QGradient渐变填充

    QGradient渐变填充 QGradient (一)简介 (二)枚举类型 1.spread 2.CoordinateMode 3.type (三)常用函数 1.coordinateMode() 2. ...