本文做了一些常见知识点归纳,方便对知识的梳理和应用,比如:Rust路径运算符,其中就涉及turbofish运算符,是Rust中一种特殊做法。
1. 前言
Rust在设计上有自己很多独特的思路和设计,在学习Rust过程中,对常见知识点进行归纳总结,可以加快加深对Rust的掌握和应用。
- 路径运算符,
:: - 问号,
? - 胖指针
- FFI 类型转换
2. 路径运算符
| 用法 | 示例 | 说明 |
|---|---|---|
| 模块路径 | crate::utils::helper() |
访问模块中的函数 |
| 类型的关联函数(静态方法) | String::from("abc") |
调用类型的静态/关联函数 |
| 枚举构造器 | Option::Some(42) |
枚举的某个变体 |
| 泛型类型显式指定(turbofish) | "123".parse::<i32>() |
指定 .parse() 的返回类型 |
| 常量访问 | std::f32::consts::PI |
访问某个类型下定义的常量 |
类型路径(如 as 类型转换) |
value as std::ffi::c_void |
明确写出类型的完整路径 |
use 关键字,可以根据路径这个思路,导入:模块、类型、枚举、函数、宏、常量、嵌套(大括号),并支持重命名,甚至可以导入结构体字段(如果字段是pub的)。如果是全局导入,::写在最前面。
但是use不能引入泛型类型参数,及 ::<T>,也不能引入方法调用链,因为use知识声明作用域,不具备执行能力。
为什么turbofish也能成为路径呢?
可以理解为,函数parse()是一个泛型函数,从顺序上讲,先有函数,才有函数依赖的泛型,所以,泛型属于函数的下一级逻辑,干脆安排泛型属于函数的路径上的下一级。于是 parse() 写成 parse::<i32>()。
那为什么不写成 parse()::<i32> 呢?parse()<::i32> 表示函数已经执行完成了,再做 ::<i32>操作。显然不行,泛型需要在函数执行前就指定好。