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

使用flat_map遇“编译期无法确定[char]大小”错误的疑问

Rust切片语法疑问:为何row[j..j+3]需要额外添加&?

问题重现

你编写的Rust代码如下:

pub fn is_valid_sudoku(board: Vec<Vec<char>>) -> bool {
    let block_it = |i, j| board[i..i + 3].iter().flat_map(move |row| {
        row[j..j + 3]
    });
    // Rest of the code...
}

运行时遇到错误:the size for values of type [char] cannot be known at compilation time,将row[j..j+3]改为&row[j..j+3]后错误消失。你疑惑的是:已知row类型为&Vec<char>,按理解row[j..j+3]应该是&[char],为何需要额外加&?

问题原因

你的核心误解在于切片表达式的实际返回类型:

  • Rust中,切片表达式x[a..b]作为右值时,是*x.index(a..b)的语法糖。对于Vec<T>(或&Vec<T>),index方法返回的是&[T](切片引用),解引用后得到的是[T]——也就是动态大小的切片本身。
  • [char]属于动态大小类型(DST),Rust无法在编译时确定它的内存大小,因此不能将其作为闭包的返回值,这就是报错的直接原因。

解决方案解释

当你添加&写成&row[j..j+3]时,实际上是对动态大小的[char]取引用,得到&[char]类型——这是一个胖指针(包含指向数据的指针和切片长度),内存大小固定,完全符合Rust对返回值的类型要求。

flat_map需要闭包返回实现IntoIterator的类型,&[char]恰好实现了该 trait,会自动转换为遍历&char的迭代器,因此代码可以正常编译运行。

补充验证

你可以通过以下代码验证切片表达式的返回类型:

fn main() {
    let v = vec!['a', 'b', 'c'];
    // 以下代码会报错:无法确定`[char]`的大小
    // let s = v[0..2];
    // 正确写法:显式取引用得到`&[char]`
    let s = &v[0..2];
    println!("{:?}", s);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:02:02