Rust将u32替换为u64无符号整数时编译失败的原因
编译错误核心原因
这个报错和u64是不是Rust内置类型没有任何关系,纯粹是写错了for循环的语法:Rust的for循环不支持在迭代变量后直接加冒号写内联类型标注,你改代码时多加的:u64违反了语法规则,才触发了连锁报错。
报错逻辑拆解
你写的错误代码行是:
for fib: u64 in r {
- 第一个语法报错
expected one of@or|, found:``:for关键字后紧跟的是模式匹配位置,合法的模式语法在变量名后只允许出现@(绑定子模式)、|(多模式分支)这类符号,不支持直接跟冒号写类型标注,编译器看到冒号直接判定语法不合法。 - 第二个报错
use of undeclared crate or modulefib``是语法错误触发的连锁解析失败:编译器遇到不符合预期的冒号时,会误把前面的fib当作模块/crate路径的前缀,以为你要写类似fib::u64的路径引用,找不到对应模块就抛出了未声明的错误。
你之前的u32版本能正常编译,根本不是u32有什么特殊待遇,是因为那个版本的for循环写的是for fib in r,根本没有加多余的类型标注,自然符合语法要求。
正确修改方式
迭代变量的类型完全由迭代器的关联Item类型决定,不需要在for行手动标注,你只要把所有和斐波那契计算相关的u32类型统一替换成u64即可,参考修改后的可运行代码:
use std::io; use std::ops::Range; fn main() { println!("Please enter a fibonacci number to evaluate to:"); let mut n: String = String::new(); io::stdin().read_line(&mut n).expect("Not a number"); // 把解析后的数值类型改成u64 let mut _n: u64 = n.trim().parse().expect("Please type a number!"); // 把Range的泛型参数改成u64 let mut r: Range<u64> = Range { start: 0, end: _n }; // 外层变量声明也改成u64(这个变量会被循环内的fib遮蔽,实际可以删掉) let mut fib: u64 = 0; // 不要在for后面加类型标注,迭代出来的fib自然是u64类型 for fib in r { fibonacci(fib); println!("The fibonacci number is {}", fibonacci(fib)); } } // 函数参数、返回值都改成u64 fn fibonacci(n: u64) -> u64 { match n { 0 => 1, 1 => 1, _ => fibonacci(n - 1) + fibonacci(n - 2), } }
补充说明:Rust只允许在
let变量绑定、函数参数、关联项定义等位置直接写变量名: 类型的标注,for循环的模式位置目前不支持这种写法,强行加就会触发你遇到的语法错误。
内容的提问来源于stack exchange,提问作者Kaligino
相关产品推荐
相关产品推荐

