此代码有效并打印“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
to usize
并用在nth()
?
您能做的最谨慎的事情就是使用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
}
对于更广泛的数字转换类型u32
usize
,参考如何安全且惯用地在数字类型之间进行转换?.
也可以看看:
- 为什么允许使用“as”从 u64 到 usize 进行类型转换,但不允许使用“From”?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)