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

能否在编译时分割&str?编译时生成u64切片实现咨询

编译时将include_bytes!导入的空格分隔数字转为u64切片

要解决这个问题,核心是避开非const的字符串分割操作,改用编译时可执行的const函数手动解析字节流。Rust的const上下文支持基础的字节遍历和数值计算,刚好能满足需求。

实现方案

下面是完整的代码示例,包含编译时解析逻辑和使用方式:

const fn parse_space_separated_numbers(bytes: &[u8]) -> (usize, [u64; 64]) {
    let mut nums = [0u64; 64];
    let mut num_count = 0;
    let mut current_num = 0u64;
    let mut parsing_num = false;

    for &byte in bytes {
        match byte {
            b'0'..=b'9' => {
                parsing_num = true;
                current_num = current_num * 10 + (byte - b'0') as u64;
            }
            // 处理空白字符:空格、换行、回车
            b' ' | b'\n' | b'\r' => {
                if parsing_num {
                    nums[num_count] = current_num;
                    num_count += 1;
                    current_num = 0;
                    parsing_num = false;
                }
            }
            _ => panic!("Invalid character in number list: {}", byte),
        }
    }

    // 处理列表末尾的最后一个数字(如果没有 trailing 空格)
    if parsing_num {
        nums[num_count] = current_num;
        num_count += 1;
    }

    (num_count, nums)
}

// 导入目标文件的字节数据
const INPUT_BYTES: &[u8] = include_bytes!("numbers.txt");
// 编译时解析数字
const (NUM_COUNT, NUM_STORAGE): (usize, [u64; 64]) = parse_space_separated_numbers(INPUT_BYTES);
// 生成刚好包含所有数字的切片
const NUMBERS: &[u64] = &NUM_STORAGE[0..NUM_COUNT];

fn main() {
    println!("Parsed u64 slice: {:?}", NUMBERS);
}

关键细节说明

  1. const函数解析逻辑:parse_space_separated_numbers在编译时遍历字节数组,逐个识别数字字符并累积数值,遇到空白字符时将累积的数值存入结果数组。
  2. 预定义存储数组:我们预先声明了一个足够大的数组(示例中是[u64;64])来存储解析后的数字,你可以根据实际数字数量调整数组长度——如果数字数量超过数组大小,编译时会直接panic提醒。
  3. 生成切片:通过&NUM_STORAGE[0..NUM_COUNT]得到仅包含有效数字的切片,避免多余的零值。
  4. 格式兼容性:额外处理了换行符和回车符,确保即使数字列表是多行格式也能正确解析。

注意事项

  • 输入文件必须仅包含数字和空白字符,否则编译时会触发panic报错。
  • 如果需要支持更大的数字列表,只需增大parse_space_separated_numbers中结果数组的容量即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:55:19