Rust中slice为何可直接调用into_iter,不定长[T]为何编译通过?
核心结论
你代码里名为slice的变量不是[T]类型,它是一个完全定长的切片迭代器实例,完全符合Rust编译规则,不会触发不定长类型的相关报错。
具体类型推导过程
v的类型是Vec<char>,对Vec执行范围索引操作v[1..3],返回值的原生类型确实是不定长的[char]- Rust编译器会对无法直接操作的不定长
[char]自动执行Deref强制转换,将其转为&[char](定长的切片共享引用,占用两个usize长度的内存,存储数据指针和切片长度) - 你后续调用了
.into_iter()方法,&[T]类型的into_iter()会返回std::slice::Iter<'_, char>类型的迭代器,这是一个完全定长的结构体类型 - 最终你赋值给
slice变量的就是这个迭代器,自然可以正常编译
顺便说明:你这里的变量名slice属于误命名,它实际存储的是迭代器不是切片本身,容易误导你对类型的判断。
验证方法
你可以把代码里的.into_iter()去掉,直接写let slice = v[1..3];,编译器会立即抛出你预期的不定长类型错误:
error[E0277]: the size for values of type `[char]` cannot be known at compilation time --> src/lib.rs:4:9 | 4 | let slice = v[1..3]; | ^^^^^ doesn't have a size known at compile-time
内容的提问来源于stack exchange,提问作者ban
相关产品推荐
相关产品推荐

