能否在编译时分割&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); }
关键细节说明
- const函数解析逻辑:
parse_space_separated_numbers在编译时遍历字节数组,逐个识别数字字符并累积数值,遇到空白字符时将累积的数值存入结果数组。 - 预定义存储数组:我们预先声明了一个足够大的数组(示例中是
[u64;64])来存储解析后的数字,你可以根据实际数字数量调整数组长度——如果数字数量超过数组大小,编译时会直接panic提醒。 - 生成切片:通过
&NUM_STORAGE[0..NUM_COUNT]得到仅包含有效数字的切片,避免多余的零值。 - 格式兼容性:额外处理了换行符和回车符,确保即使数字列表是多行格式也能正确解析。
注意事项
- 输入文件必须仅包含数字和空白字符,否则编译时会触发panic报错。
- 如果需要支持更大的数字列表,只需增大
parse_space_separated_numbers中结果数组的容量即可。
内容的提问来源于stack exchange,提问作者Poperton
相关产品推荐
相关产品推荐

