スキル一覧に戻る
huiali

rust-const

by huiali

An AI expert capability layer for Rust engineering practices, centered on modular skill orchestration and collaborative execution chains. It turns Rust’s core knowledge structures into callable reasoning and decision units, enabling diagnosis, design, and optimization in complex real-world scenarios.

1🍴 1📅 2026年1月25日
GitHubで見るManusで実行

SKILL.md


name: rust-const description: "Const generics 与编译时计算专家。处理 const泛型、类型级计算、编译时求值、MaybeUninit 数组等问题。触发词:const, generics, compile-time, MaybeUninit, 类型级计算, 编译时" globs: ["**/*.rs"]

Const Generics 与编译时计算

核心问题

哪些计算可以在编译时完成?

Rust 的 const fn 让你在编译时运行代码。


基本 const 泛型

struct Array<T, const N: usize> {
    data: [T; N],
}

let arr: Array<i32, 5> = Array { data: [0; 5] };

数组初始化

// 栈上固定大小数组
let arr: [i32; 100] = [0; 100];

// MaybeUninit 用于未初始化内存
use std::mem::MaybeUninit;
let mut arr: [MaybeUninit<i32>; 100] = [MaybeUninit::uninit(); 100];

// 初始化后使用
unsafe {
    let arr: [i32; 100] = arr.map(|x| x.assume_init());
}

Const Fn

const fn double(x: i32) -> i32 {
    x * 2
}

const VAL: i32 = double(5);  // 编译时计算

// 编译时检查
const fn checked_div(a: i32, b: i32) -> i32 {
    assert!(b != 0, "division by zero");
    a / b
}

当前限制

// 有些操作 const fn 还不能做
const fn heap_alloc() -> Vec<i32> {
    Vec::new()  // ❌ 还不支持
}

const fn dynamic_size(n: usize) -> [i32; n] {
    // ❌ 数组大小必须是 const
    [0; n]
}

编译时检查模式

// 数组长度检查
const fn assert_len<T>(slice: &[T], len: usize) {
    assert!(slice.len() == len);
}

// 使用
const _: () = assert_len(&[1, 2, 3], 3);  // 编译时断言

// 类型级状态机
struct StateMachine<S: State> {
    data: Vec<u8>,
    _phantom: std::marker::PhantomData<S>,
}

trait State {}
struct Initial;
struct Processing;
struct Done;

impl StateMachine<Initial> {
    fn start(self) -> StateMachine<Processing> {
        StateMachine {
            data: vec![],
            _phantom: std::marker::PhantomData,
        }
    }
}

常用模式

模式用途示例
数组类型固定大小集合[T; N]
缓冲区大小避免动态分配const SIZE: usize = 1024
编译时检查提前发现问题assert! in const fn
类型状态状态机StateMachine<S>

MaybeUninit 使用

// 安全初始化模式
fn init_array<T: Default + Copy>(len: usize) -> Vec<T> {
    let mut vec = Vec::with_capacity(len);
    for _ in 0..len {
        unsafe {
            vec.as_mut_ptr().write(T::default());
        }
    }
    unsafe {
        vec.set_len(len);
    }
    vec
}

// 大数组:栈可能溢出
fn big_array_on_heap() -> Box<[u8; 1024 * 1024]> {
    Box::new([0; 1024 * 1024])
}

常见错误

错误原因解决
栈溢出大数组在栈上用 Box 或 Vec
数组大小不匹配const 泛型值错误检查常量值
const fn 不支持语言限制用 runtime 或 nightly
MaybeUninit 未初始化UB正确使用 assume_init

スコア

総合スコア

70/100

リポジトリの品質指標に基づく評価

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

+10
説明文

100文字以上の説明がある

+10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

レビュー

💬

レビュー機能は近日公開予定です