为什么 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
.
我是 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
.