美文网首页rust
rust学习总结-2

rust学习总结-2

作者: robertzhai | 来源:发表于2022-02-27 13:54 被阅读0次

声明变量

let

可变性

默认不可变
mut 修饰可变

变量遮蔽(shadowing)

Rust 允许声明相同的变量名,在后面用let声明的相同名称的变量会遮蔽掉前面声明的

类型

  • 基本类型
  • 复合类型

基本类型

  • 数值类型: 有符号整数 (i8, i16, i32, i64, isize)、 无符号整数 (u8, u16, u32, u64, usize) 、浮点数 (f32, f64)、以及有理数、复数
  • 字符串:字符串字面量和字符串切片 &str
  • 布尔类型: true和false
  • 字符类型: 表示单个Unicode字符,存储为4个字节
  • 单元类型: 即 () ,其唯一的值也是 ()

复合类型

  • 字符串与切片
  • 元组 tup
  • 结构体 struct
  • 枚举 enum
  • 数组

语句和表达式()

表达式结尾没有";",总要返回值

   let x = x + 1; // 语句
    let y = y + 5; // 语句
    x + y // 表达式

函数

  • 用fn关键字定义一个函数
  • 用return或最后一条表达式作为函数返回值
  • 无返回值的函数会隐式返回一个 ()
  • 作函数返回类型的时候,表示该函数永不返回

内存管理的3种机制

  • 垃圾回收机制(GC),在程序运行时不断寻找不再使用的内存,典型代表:Java、Go
  • 手动管理内存的分配和释放, 在程序中,通过函数调用的方式来申请和释放内存,典型代表:C++
  • 通过所有权来管理内存,编译器在编译时会根据一系列规则进行检查,典型代表:Rust

所有权

  • 每个值都只能有一个所有者(变量)
  • 每个值同时只能有一个所有者
  • 所有者(变量)离开作用域范围时,这个值将被丢弃(free),Rust 会自动调用 drop 函数并清理变量的内存

stack & heap

stack存储已知且固定大小的内存空间的数据,快, 如基本类型
heap存储大小未知或者可能变化的数据,慢,如struct
对比:入栈比在堆上分配内存要快,栈数据往往可以直接存储在 CPU 高速缓存中,而堆数据只能存储在内存中。访问堆上的数据比访问栈上的数据慢,因为必须先访问栈再通过栈上的指针来访问内存。处理器处理和分配在栈上数据会比在堆上的数据更加高效

所有权与堆栈

  • 当你的代码调用一个函数时,传递给函数的参数(包括可能指向堆上数据的指针和函数的局部变量)依次被压入栈中,当函数调用结束时,这些值将被从栈中按照相反的顺序依次移除。
  • 因为堆上的数据缺乏组织,因此跟踪这些数据何时分配和释放是非常重要的,否则堆上的数据将产生内存泄漏 —— 这些数据将永远无法被回收。这就是 Rust 所有权系统为我们提供的强大保障。

move

  • 浅拷贝,只拷贝stack上的内容,指针指向的内容不拷贝
let s1 = String::from("rust");
let s2 = s1;

println!("{}, world!", s1);

move

  • 浅拷贝( shallow copy ),只拷贝stack上的内容,指针指向的内容不拷贝
  • 任何自动的复制都是浅拷贝
  • 浅拷贝发生在stack上

克隆(深拷贝)

  • 首先,Rust 永远也不会自动创建数据的 “深拷贝”。因此,任何自动的复制都不是深拷贝,可以被认为对运行时性能影响较小。
  • 如果我们确实需要深度复制 String 中堆上的数据,而不仅仅是栈上的数据,可以使用一个叫做 clone 的方法。
let s1 = String::from("rust");
let s2 = s1.clone();

println!("s1 = {}, s2 = {}", s1, s2);

函数传值与返回

  • 将值传递给函数,一样会发生 移动 或者 复制

借用(Borrowing)

  • 获取变量的引用
  • 和go 、c 一样
  • 函数参数类型签名变化,eg: String => &String
  • 允许你使用值,但是不获取所有权
  • 默认是不可变引用,当引用离开作用域后,其指向的值也不会被丢弃
  • 可变引用加mut:&mut
  • 同一作用域,特定数据只能有一个可变引用,可以多个不变引用
  • 引用的作用域 s 从创建开始,一直持续到它最后一次使用的地方,这个跟变量的作用域有所不同,变量的作用域从创建持续到某一个花括号 }
fn main() {
   let mut s = String::from("hello");

    let r1 = &s; 
    let r2 = &s; 
    println!("{} and {}", r1, r2);
    // 新编译器中,r1,r2作用域在这里结束

    let r3 = &mut s; 
    println!("{}", r3);
} // 老编译器中,r1、r2、r3作用域在这里结束
  // 新编译器中,r3作用域在这里结束
  • 同一时刻,你只能拥有要么一个可变引用, 要么任意多个不可变引用
  • 引用必须总是有效的

相关文章

  • rust学习总结-2

    声明变量 let 可变性 默认不可变mut 修饰可变 变量遮蔽(shadowing) Rust 允许声明相同的变量...

  • rust基础学习总结

    1,对象实现Clone等接口 impl Clone for Obj { fn clone(&self)->Se...

  • rust学习总结-3

    _占位符 忽略该值或者类型,类似go中的 使用下划线开头忽略未使用的变量, 不会产生警告 _x 仍会将值绑定到变量...

  • rust学习总结-4

    Vector 动态数组类型用Vec 访问元素,确保索引不会越界的时候,就用索引访问,否则用 .get(索引超...

  • rust学习总结-1

    安装 install[https://www.rust-lang.org/zh-CN/tools/install]...

  • rust学习总结001

  • rust学习总结002

    rust 哈希表常用操作 获取 HashMap 成员 hashMap[key]hashMap.get(key)

  • Rust学习笔记(2)

    内容整理自:https://doc.rust-lang.org/book/title-page.html Chap...

  • 二零一七年二月

    技术 Rust 中文WikiRust PlaygroundRust学习资源和路线Rust in Detail: W...

  • Rust从安装到语法基础

    rust学习资源 rust中文网[https://www.rust-lang.org/zh-CN/]通过例子学ru...

网友评论

    本文标题:rust学习总结-2

    本文链接:https://www.haomeiwen.com/subject/gwkvlrtx.html