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

3
我是一个 Rust 新手,我测试了下面的代码并且有一个问题。 slice 的类型是 [T] 吗?如果是,[T] 是不定长的,但是当我编译这段代码时它通过了,为什么呢?
#[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);
}
1个回答

4
由于不存在 [T]::into_iter(self),但是存在 [T]::into_iter(&self),编译器会插入缺失的引用,并将 (v[1..3]).into_iter() 视为 (&v[1..3]).into_iter()。然后,这等同于 (&v[1..3]).iter() 并输出向量元素的引用。(甚至有一个clippy lint警告您不要在切片或其他引用上使用 into_iter()。)同样的自动引用机制也使您能够编写 v.len(),而不是 “正确的” (&v).len(),尽管 Vec::len 接受 &self 参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接