【问题标题】:How do I slice an array with an i32 limit?如何切片具有 i32 限制的数组?
【发布时间】:2016-07-20 14:32:05
【问题描述】:

我正在尝试使用动态边界对数组进行切片:

fn main() {
    let n: i32 = 2;
    let a = [1, 2, 3];
    println!("{:?}", &a[0..n]);
}

它给了我以下错误:

错误:特征绑定 [_]: std::ops::Index<std::ops::Range<i32>> 不满足

我不知道如何处理这个错误。看来我不能使用i32 对数组进行切片?

【问题讨论】:

    标签: rust


    【解决方案1】:

    您可以在slice docs(搜索Index<Range)中检查Index trait 仅适用于usize 范围,因此您不能使用Range<i32>

    一种可能性是将i32 转换为usize

    fn main() {
        let n: i32 = 2;
        let a = [1,2,3];
        println!("{:?}", &a[0..n as usize]); 
    }
    

    但是你应该小心,因为没有检查转换,一个负的i32 值可以转换为usize 而不会出错。您可以创建一个函数来进行检查转换或使用 crate(例如 num::ToPrimitive)。

    未来,Rust 将在标准库中添加 checked conversion

    【讨论】:

    • 真正正确的答案是尽早尝试将n 存储为usize。如果是某种用户输入,则应将其解析为usize,因为任何负数都对索引无效。
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2017-09-07
    • 2018-09-30
    • 2012-11-10
    • 2016-12-18
    • 1970-01-01
    • 2022-01-01
    • 2014-02-02
    相关资源
    最近更新 更多