【发布时间】:2021-03-11 18:27:55
【问题描述】:
我想知道是否有人有允许从 usize 类型(我们通过访问数组索引或获取向量长度获得)到 i32 的隐式转换的解决方案?有没有可能?
当然,我假设向量长度和数组边界在 i32 范围内。
【问题讨论】:
标签: rust
我想知道是否有人有允许从 usize 类型(我们通过访问数组索引或获取向量长度获得)到 i32 的隐式转换的解决方案?有没有可能?
当然,我假设向量长度和数组边界在 i32 范围内。
【问题讨论】:
标签: rust
您可以在函数参数中使用 TryInto 特征从调用者的角度进行隐式转换。它仍然涉及转换,但将复杂性转移到被调用的函数上:
use std::convert::TryInto;
fn stuff(val: impl TryInto<i32>) {
// use try_into trait method
let val = match val.try_into() {
Ok(v) => v,
Err(_) => panic!("couldn't fit in i32"),
};
println!("in stuff: val has {} leading zeros", val.leading_zeros());
}
fn main() {
let letters = ['a', 'b', 'c'];
let len = letters.len();
println!("in main: len has {} leading zeros", len.leading_zeros());
stuff(len); // implict conversion
}
输出
in main: len has 62 leading zeros
in stuff: val has 30 leading zeros
【讨论】:
as 关键字不是更有效吗(因为我们知道转换会起作用)?类似:fn stuff(val:usize as i32) {
我认为没有办法隐含地做到这一点。如果有,那就不是很惯用了:Rust 决定避免隐式转换并确保所有转换都是显式完成的。
对于直接转换,as 可能是最好的选择。对于您担心溢出等的转换,您有From 和TryFrom。对于小长度转换为i32,length as i32 可能是最简单的。
它确实让事情变得更加冗长,但我发现这是一个相当不错的折衷方案。
as 上的 Rust 书中有一篇很好的文章:https://doc.rust-lang.org/rust-by-example/types/cast.html#casting
【讨论】: