【问题标题】:Rust: Implicitly convert from usize to the corresponding int typeRust:从 usize 隐式转换为对应的 int 类型
【发布时间】:2021-03-11 18:27:55
【问题描述】:

我想知道是否有人有允许从 usize 类型(我们通过访问数组索引或获取向量长度获得)到 i32 的隐式转换的解决方案?有没有可能?

当然,我假设向量长度和数组边界在 i32 范围内。

【问题讨论】:

    标签: rust


    【解决方案1】:

    您可以在函数参数中使用 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
    

    Try on the playground

    【讨论】:

    • 非常好,正是我想要的!非常感谢!数组索引有什么解决方案吗?
    • @AntoninGAVREL 我认为数组索引不可能进行隐式转换,因为数组索引实现是在标准库中完成的。
    • 好吧,TryInto 似乎也是 TryFrom 的反面,但使用 as 关键字不是更有效吗(因为我们知道转换会起作用)?类似:fn stuff(val:usize as i32) {
    【解决方案2】:

    我认为没有办法隐含地做到这一点。如果有,那就不是很惯用了:Rust 决定避免隐式转换并确保所有转换都是显式完成的。

    对于直接转换,as 可能是最好的选择。对于您担心溢出等的转换,您有FromTryFrom。对于小长度转换为i32length as i32 可能是最简单的。

    它确实让事情变得更加冗长,但我发现这是一个相当不错的折衷方案。

    as 上的 Rust 书中有一篇很好的文章:https://doc.rust-lang.org/rust-by-example/types/cast.html#casting

    【讨论】:

    • “有点冗长”是轻描淡写;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多