此代码工作并打印“b”:
fn main() {
let s = "abc";
let ch = s.chars().nth(1).unwrap();
println!("{}", ch);
}
另一方面,此代码导致不匹配类型错误。
fn main() {
let s = "abc";
let n: u32 = 1;
let ch = s.chars().nth(n).unwrap();
println!("{}", ch);
}
error[E0308]: mismatched types
--> src/main.rs:5:28
|
5 | let ch = s.chars().nth(n).unwrap();
| ^ expected usize, found u32
由于某些外部原因,我必须使用u32
类型的变量n
。我如何将u32
转换为usize
并在nth()
中使用它?
as
运算符适用于所有数字类型:
let ch = s.chars().nth(n as usize).unwrap();
Rust强制您转换整数以确保您了解签名或溢出。
整数常量可以有一个类型后缀:
let n = 1u32;
但是,请注意负面常数,例如-1i32
是内部-
1i32
。
声明没有显式类型规范的整数变量显示为{integer}
,将从其中一个方法调用中正确推断。
你可以做的最谨慎的事情是当值不能适合TryFrom
时使用usize
和恐慌:
use std::convert::TryFrom;
fn main() {
let s = "abc";
let n: u32 = 1;
let n_us = usize::try_from(n).unwrap();
let ch = s.chars().nth(n_us).unwrap();
println!("{}", ch);
}
通过盲目地使用as
,当在usize
小于32位的平台上运行时,您的代码将以神秘的方式失败。例如,某些微控制器使用16位整数作为原始大小:
fn main() {
let n: u32 = 0x1_FF_FF;
// Pretend that `usize` is 16-bit
let n_us: u16 = n as u16;
println!("{}, {}", n, n_us); // 131071, 65535
}