我想在Rust中将一个usize
类型的变量转换为u32
类型的变量。我知道usize
变量可能包含一个大于2^32的值,如果是这种情况则转换应该失败。我正在尝试使用TryFrom
特质来执行转换。
这是一个简单的示例(夜间版Rust,Playground):
#![feature(try_from)]
use std::convert::TryFrom;
fn main() {
let a: usize = 0x100;
let res = u32::try_from(a);
println!("res = {:?}", res);
}
代码无法编译,出现以下编译错误:
error[E0277]: the trait bound `u32: std::convert::From<usize>` is not satisfied
--> src/main.rs:6:15
|
6 | let res = u32::try_from(a);
| ^^^^^^^^^^^^^ the trait `std::convert::From<usize>` is not implemented for `u32`
|
= help: the following implementations were found:
<u32 as std::convert::From<std::net::Ipv4Addr>>
<u32 as std::convert::From<u8>>
<u32 as std::convert::From<char>>
<u32 as std::convert::From<u16>>
= note: required because of the requirements on the impl of `std::convert::TryFrom<usize>` for `u32`
从编译错误中我推断出,对于u32
来说,拥有TryFrom<usize>
取决于是否拥有From<usize>
,这似乎有点奇怪。
是否有其他方法可以利用TryFrom
从usize
转换为u32
?如果没有,是否有其他惯用的方法执行此转换?
我知道可以使用 as
关键字,但它不会通知我转换是否失败。此外,我认为可以编写自己的函数来进行转换,但如果 Rust 没有某种惯用的方式来执行此转换,我会感到惊讶。毕竟,usize
和u32
是两种基本类型。