Rust中uint类型未找到:原代码可用原因及修复方法
Rust中
uint类型找不到的问题 我找到了一份Rust实现B树的代码,其中定义BTreeMap结构体时用到了uint类型:
pub struct BTreeMap<K, V> { root: Node<K, V>, length: uint, depth: uint, b: uint, }
复制这段代码到我的项目后,出现了如下错误:
error[E0412]: cannot find type `uint` in this scope --> src/bin/prepare-btree.rs:9:13 | 9 | length: uint, | ^^^^ not found in this scope
我尝试添加以下导入,但都没用:
use core::prelude::*;
use {core::primitive::uint};
我当前文件的所有导入是:
use std::io::{BufRead, BufReader}; use std::fs::File; use {core::iter::Map};
注:原问题中提到的uint相关文档对应Rust早期版本的定义,该类型现已被弃用。
问题
use core::prelude::*;的作用是什么?为什么原代码里uint可以直接用?- 怎么修复我代码里的“cannot find type
uintin this scope”错误?
解答
问题1:关于use core::prelude::*;和原代码中uint可用的原因
core::prelude::*是Rust的前置导入模块,会自动导入核心库中最常用的类型、Trait和函数,减少开发者手动导入的工作量,不过该模块的内容会随Rust版本迭代调整。- 原代码基于非常老旧的Rust版本(从提交信息可判断是2016年左右的版本),在那个版本中,
uint是内置的类型别名,等价于usize,且当时的core::prelude包含了这个别名,或者它本身就是全局可见的内置类型,因此无需额外导入即可直接使用。
问题2:修复错误的方法
现代Rust稳定版已完全移除uint这个旧类型别名,可通过以下方式解决:
- 直接替换为
usize:原代码里的uint本质就是usize(length、depth这类表示长度、深度的字段,用usize最合理,它与平台指针宽度匹配),将所有uint替换为usize即可:pub struct BTreeMap<K, V> { root: Node<K, V>, length: usize, depth: usize, b: usize, } - 自定义类型别名(不推荐):如果要临时兼容旧代码风格,可以自行定义别名,但不符合现代Rust规范,不建议使用:
type uint = usize;
另外注意:现代Rust中不存在core::primitive::uint,因此导入该路径会报错,直接忽略即可。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

