You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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官方的「切片」章节有明确说明。

内容的提问来源于stack exchange,提问作者code_mechanic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:52:34