[RangeFrom<{integer}> 未实现特征 SliceIndex<[i32]> ;1]

Ram*_*ana 0 rust

AsRef[i32]我编写了一个函数,它采用带有bound的通用参数T。现在我想使用方法在函数内部进一步对输入进行切片get。但 Rust 编译器不允许我使用1..范围来切片。我可以使用split_at方法来分割切片。那可行。但我的问题是为什么我不能array.as_ref().get([1..])在这种情况下使用?我是否需要向泛型类型添加任何其他特征边界才能使其工作?如果我使用这样get的一个索引array.as_ref().get(0)就可以了。

这是我的代码 -

fn find<T>(array: T, key: i32) -> Option<usize> 
where 
    T: AsRef<[i32]>,
{
    let arr = array.as_ref().get([1..]);
    println!("slicing successful");
    
    None
}

fn main() {
    let arr = [1, 2, 3];
    find(arr, 1);
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接

Bla*_*ans 5

您混淆了两种语法。第一个是最常用于索引切片的:

let arr = array.as_ref()[1..];
Run Code Online (Sandbox Code Playgroud)

这只是语法糖

let arr = array.as_ref().index(1..);
Run Code Online (Sandbox Code Playgroud)

请注意,要使第二个版本起作用,您需要std::ops::Index在范围内具有该特征。

这不会按原样工作,因为它返回一个切片[i32], 和[i32]: !Sized。因此,您需要添加一个间接级别:

let arr = &array.as_ref()[1..];
Run Code Online (Sandbox Code Playgroud)

看看操场

第二种可能的方法是使用get切片方法:

let arr = array.as_ref().get(1..);
Run Code Online (Sandbox Code Playgroud)

看看操场