动机

  1. 与操作系统靠近,操控底层概念

学习方法

  • 快速过语法: 通用语言差不多,图灵机基础概念很少
  • 通过一个项目学习生态工具,cargo
  • 使用ide自动补全,不需要记住语法
  • 应用:
    • 操作系统
    • VR
    • python/smalltalk调用

Python & Rust

  • pyo3: 双向调用
  • RustPython: Rust实现的Python解释器
    • WebAssembly

hello world

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
fn add2(x: i32, y: i32) -> i32 {
    // Implicit return (no semicolon)
    x + y
}

fn main() {
    let x = "hello world!";
    println!("Hello, world!");
    println!("{}",add2(1,2));
    println!("{}",x);
}

变量类型自动推到 for循环现代 列表内置

有类似类的东西

面相对象

Rust 的面向对象特性

对象(Object)来源于 20 世纪 60 年代的 Simula 编程语言。这些对象影响了 Alan Kay 的编程架构中对象之间的消息传递。他在 1967 年创造了 面向对象编程 这个术语来描述这种架构。

对象包含数据和行为(4人帮) 在这个定义下,Rust 是面向对象的:结构体和枚举包含数据而 impl 块提供了在结构体和枚举之上的方法。虽然带有方法的结构体和枚举并不被 称为 对象,但是他们提供了与对象相同的功能, 封装隐藏了实现细节

相反 Rust 代码可以使用默认 trait 方法实现来进行共享

trait 对象是一个 Rust 中获取部分面向对象功能的方

消息传递

使用消息传递在线程间传送数据

一个日益流行的确保安全并发的方式是 消息传递(message passing),这里线程或 actor 通过发送包含数据的消息来相互沟通。这个思想来源于 Go 编程语言文档中 的口号:“不要通过共享内存来通讯;而是通过通讯来共享内存。”

Rust 中一个实现消息传递并发的主要工具是 通道(channel),Rust 标准库提供了其实现的编程概念。你可以将其想象为一个水流的通道,比如河流或小溪。如果你将诸如橡皮鸭或小船之类的东西放入其中,它们会顺流而下到达下游。

编程中的通道有两部分组成,一个发送者(transmitter)和一个接收者(receiver)

由于历史原因,tx 和 rx 通常作为 发送者(transmitter)和 接收者(receiver)的缩写 让我们将发送端移动到一个新建线程中并发送一个字符串,这样新建线程就可以和主线程通讯了

指针

指针 (pointer)是一个包含内存地址的变量的通用概念, 这个地址引用,或 “指向”(points at)一些其他数据

Rust 中最常见的指针是第四章介绍的 引用(reference)。引用以 & 符号为标志并借用了他们所指向的值。除了引用数据没有任何其他特殊功能。它们也没有任何额外开销,所以应用得最多。

智能指针(smart pointers)是一类数据结构,他们的表现类似指针,但是也拥有额外的元数据和功能。引用计数智能指针记录总共有多少个所有者,并当没有任何所有者时负责清理数据。

普通引用和智能指针的一个额外的区别是引用是一类只借用数据的指针;相反,在大部分情况下,智能指针 拥有 他们指向的数据。

所有权

Rust 的核心功能(之一)是 所有权(ownership)

所有运行的程序都必须管理其使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时不断地寻找不再使用的内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查

栈(Stack)与堆(Heap)

栈和堆都是代码在运行时可供使用的内存,但是它们的结构不同。栈以放入值的顺序存储值并以相反顺序取出值。这也被称作 后进先出(last in, first out)

栈中的所有数据都必须占用已知且固定的大小。在编译时大小未知或大小可能变化的数据,要改为存储在堆上。堆是缺乏组织的:当向堆放入数据时,你要请求一定大小的空间。内存分配器(memory allocator)在堆的某处找到一块足够大的空位,把它标记为已使用,并返回一个表示该位置地址的 指针(pointer)。这个过程称作 在堆上分配内存(allocating on the heap),有时简称为 “分配”(allocating)

当你的代码调用一个函数时,传递给函数的值(包括可能指向堆上数据的指针)和函数的局部变量被压入栈中。当函数结束时,这些值被移出栈。

跟踪哪部分代码正在使用堆上的哪些数据,最大限度的减少堆上的重复数据的数量,以及清理堆上不再使用的数据确保不会耗尽空间,这些问题正是所有权系统要处理的。

  1. Rust 中的每一个值都有一个被称为其 所有者(owner)的变量。
  2. 值在任一时刻有且只有一个所有者。
  3. 当所有者(变量)离开作用域,这个值将被丢弃。

Rust 中的函数式语言功能

Rust 中的函数式语言功能:迭代器与闭包

Rust 的设计灵感来源于很多现存的语言和技术。其中一个显著的影响就是 函数式编程(functional programming)。函数式编程风格通常包含将函数作为参数值或其他函数的返回值、将函数赋值给变量以供之后执行等等。

闭包(Closures),一个可以储存在变量里的类似函数的结构 Rust 的 闭包(closures)是可以保存进变量或作为参数传递给其他函数的匿名函数。可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。不同于函数,闭包允许捕获调用者作用域中的值 迭代器(Iterators),一种处理元素序列的方式 这两个功能的性能。(剧透警告: 他们的速度超乎你的想象!)

泛型

泛型代码的性能 在阅读本部分内容的同时,你可能会好奇使用泛型类型参数是否会有运行时消耗。好消息是:Rust 实现了泛型,使得使用泛型类型参数的代码相比使用具体类型并没有任何速度上的损失。

我们可以使用泛型来编写不重复的代码,

trait

trait:定义共享的行为

wwj: 好像都是一些随意的抽象,没啥坚固的东西,互相随便抄一抄,也没啥理念。 看起来可以实现对象功能,就用它实现吧。学习者非常懵逼,概念之间的混用

注意:trait 类似于其他语言中的常被称为 接口(interfaces)的功能,虽然有一些不同。

抽象接口和实现

定义了 Summary trait,接着就可以在多媒体聚合库中需要拥有这个行为的类型上实现它了。 impl Summary for NewsArticle

参考