如何在Rust中定义递归类型别名简化单成员枚举的冗余写法?
解答
Rust中的
type关键字仅用于为现有类型创建别名,不会生成新的独立类型。递归类型别名会在类型展开时进入无限循环,编译器无法计算该类型的内存大小,因此语法上不被允许,这就是你给出的第二种写法无法编译的根本原因。
更简洁的实现方案
你可以直接使用Rust的**newtype模式(单字段元组结构体)**替代单成员枚举,写法比枚举更简洁,完全满足需求:
use std::collections::HashMap; // 仅需一行即可定义递归的Trie类型 struct Trie(HashMap<char, Box<Trie>>);
常用实现示例
你可以直接为这个结构体添加需要的方法,使用时访问.0即可拿到内部的HashMap:
impl Trie { /// 初始化空Trie节点 fn new() -> Self { Self(HashMap::new()) } /// 向Trie中插入字符串 fn insert(&mut self, s: &str) { let mut current = self; for c in s.chars() { current = current.0.entry(c) .or_insert_with(|| Box::new(Trie::new())); } } }
这种写法的合法性源于结构体是独立的新类型,编译器计算大小时:
- 外层
Trie结构体的大小等同于内部HashMap的大小(HashMap本身是固定大小的栈上结构,底层数据存在堆上) - 内部
Box<Trie>是固定大小的指针类型,不会触发无限大小计算
内容的提问来源于stack exchange,提问作者HKTonyLee
相关产品推荐
相关产品推荐

