基本数据类型-原生类型
- 元组(tuple)
允许各个元素类型不相同
1 | fn main(){ |
- 字符串
1 | // quiz2.rs |
- String
"rust is fun!".to_owned()
是一个字符串字面量(string literal),.to_owned()
是一个字符串切片(&str
)的方法,用于将字符串切片转换为一个拥有所有权的String
类型的对象。这个方法的作用是创建一个新的String
对象,其中包含了字符串切片的内容,同时拥有了自己的内存空间,与原始的字符串切片无关。"nice weather".into()
是 Rust 中的一个特殊的语法,它实际上是调用了From
trait 中的实现,将一个类型转换为另一个类型。在这种情况下,"nice weather".into()
将一个字符串字面量(&str
类型)转换为String
类型。这种转换是通过实现了From<&str> for String
的 trait 来完成的,它会将给定的字符串切片(&str
)复制到一个新的String
对象中,并返回这个新对象。这种转换通常被称为”类型推导”,因为编译器会根据上下文自动推导出需要转换的目标类型。Option
和match配合
通配符
- if let 简介控制流
相当于二元控制流
- 泛型
- Trait(interface)
(1) trait作为参数
小计:
.fold()
1 | fn main() { |
.fold()迭代器方法
1 | fn fold<B, F>(self, init: B, f: F) -> B |
这里的参数含义是:
init
是初始值,它是要合并的类型的默认值或起始状态。f
是一个闭包函数,它接受两个参数:累积值(accumulator)和当前迭代的元素,并返回一个新的累积值。
.fold()
方法会迭代迭代器的每个元素,并在每次迭代中调用闭包函数 f
,将当前累积值和当前元素作为参数传递给闭包函数,然后将闭包函数的返回值作为新的累积值。最终,.fold()
方法返回的值是所有元素被合并后得到的单个值。
智能指针
通常用结构体来实现,不同之处在于实现了Deref
和Drop trait
。Deref
trait 允许智能指针结构体示例表现的像引用一样,Drop
trait允许我们自定义当智能指针离开作用域时运行的代码
- Box
box允许将值直接放到到堆上
递归类型
cons list
每一项都包含两个元素:当前的值和下一项。其最后一项
- 计算非递归类型的大小
Rust知道为Message分配多少空间时,他会检查每一个成员,并发现quit并不需要任何空间,Move需要两个i32空间,依此类推
Deref
实现Deref允许我们重载解引用运算符*
我们无法直接使用指针所指向的数据,需要通过解引用运算符
Drop
制定在值离开作用域时应该执行Drop
trait。一般是自动进行。
当我们想手动执行,就可以使用公用的drop
Rc< T >智能指针
引用计数
- Rc< T >来共享数据
- 可以用来计数
会打印出引用计数,可以调用strong_count
函数获得
但是,虽然可以共享数据,其还是没有违反借用和所有权的定义,只是使别的变量具有a变量的可读性
RefCell < T >和内部可变性
- RefCell 大量使用unsafe代码来模糊rust规则,要手动检查是否符合规则
结合Rc < T >和 RefCell < T > 来拥有多个可变数据所有者
1 |
|
可以拥有一个表面上不可变的List
,不过可以使用RefCell< T>中提供内部可变性的方法来再需要时修改
多线程
spawn创建多线程
线程间传送数据
提供了信道(channel)来实现。信道分为发送者和接收者
可以允许多个发送者 但是只能有一个接收者
类比java
信道与所有权转移
send
函数会获取其参数的所有权并移动这个值归接收者所有。
不想所有权转移:
互斥器Mutex< T >
同步和异步:async
和多线程
异步返回的都是future
.await
异步机制的实现 更像
宏
宏(Macro)指的是 Rust 中一系列的功能:使用 macro_rules!
的 声明(Declarative)宏,和三种 过程(Procedural)宏:
- 自定义
#[derive]
宏在结构体和枚举上指定通过derive
属性添加的代码 - 类属性(Attribute-like)宏定义可用于任意项的自定义属性
- 类函数宏看起来像函数不过作用于作为参数传递的 token
为什么已经有了函数还需要宏呢?
宏是一种代码生成器,允许在编译时对代码进行操作和生成,可以在更大的范围内改变代码结构和行为。在某些情况下,使用宏可以提高代码的灵活性和效率,但同时也会增加代码的复杂性和难以理解性。
总结
怀着java的心来学rust,在很多情况下,rust所有权问题总是是一个大坑,rust是对底层深入的语言,相比于java非常多的工具链,rust给我最大的感觉就是如同汽车修理工那样,一个零件一个零件的卸下和装配。说实话,时间太短了,很多概念是第一次接受,并没有特别深入的了解,之后会尽力去做的。