Rust中`&[][..]`语法含义解析及适用场景问询
关于Rust中
&[][..]语法的解析 先看你提到的这段代码:
fn skip_until(&mut self, stop: impl FnMut(u8) -> bool) { use crate::Write; self.write_until(&mut &[][..], stop) // <- 这里的`&[][..]` }
1. &[][..]到底是什么?
这是Rust里创建空u8切片的简化写法,拆解开看:
[]:创建一个长度为0的空数组[u8; 0](类型靠上下文推断,因为write_until需要的是能写u8的目标)[..]:把这个空数组转换成切片&[u8]- 所以整个
&[][..]其实等价于&([] as [u8; 0])[..],就是一个空的不可变u8切片。前面加&mut之后,就变成了&mut [u8]——一个可变的空切片。
2. 为什么这么用?
write_until的逻辑是:读取字节直到满足stop条件,同时把读取到的字节写入传入的Write实现者里。而skip_until的需求是跳过这些字节,不需要保存,所以传一个空的可变切片进去——因为&mut [u8]实现了Write trait,往空切片里写数据会直接被丢弃(写操作会返回成功但实际没有存储),刚好完美复用write_until的逻辑,不用重复写跳过字节的代码。
3. 你的疑问解答
- 和结构体的单个切片字段无关:这个语法和结构体没有任何绑定关系,不管结构体有没有切片字段,只要需要空切片都能这么写。
- 有官方文档依据:它是两个基础语法的组合使用,官方文档都有单独说明:
- 空数组字面量:Rust允许在类型可推断时,用
[]表示长度为0的数组(比如这里编译器通过Write的约束推断出是[u8; 0]) - 切片转换操作
[..]:属于Range语法的一部分,用来将数组、Vec等可切片类型转换为切片,在Rust官方的「切片」章节有明确说明。
- 空数组字面量:Rust允许在类型可推断时,用
内容的提问来源于stack exchange,提问作者code_mechanic
相关产品推荐
相关产品推荐

