为什么 slice 可以直接调用 into_iter 而不会中止?

Why slice could call into_iter directly and do not abort?

我是 Rust 新手,我测试了以下代码并得到了一个问题。 slice的类型是[T]吗?如果是,[T]是unsized的,但是我编译代码的时候通过了。这是为什么?

#[test]
fn test_scilce(){
    let v = vec!['a', 'b', 'v'];
    let slice = (v[1..3]).into_iter();
    // let s: String = slice.collect();
    println!("{:?}", slice);
    println!("{:?}", v);
}

由于 [T]::into_iter(self) 不存在,但 [T]::into_iter(&self) 存在,因此编译器插入缺少的引用并将 (v[1..3]).into_iter() 视为 (&v[1..3]).into_iter()。这又与 (&v[1..3]).iter() 相同,并给出对向量元素的引用。 (甚至有 clippy lint 警告您在 slice 或其他引用上使用 into_iter()。)

相同的自动引用机制允许您编写 v.len() 而不是“正确的”(&v).len(),尽管 Vec::len 使用 &self.