在Rust中设计标识符AST的最佳实践

toe95027  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(91)

我正在学习Rust并实现了一个玩具解析器,在开始的时候我定义了我的AST像

struct ASTIdentifier {
   name: String,
}

字符串
这种设计的问题是我需要为每个标识符分配堆空间,并且每个标识符的名称应该来自源代码,这意味着它不需要额外的内存空间。所以我把我的struct改成了& str。

struct ASTIdentifier <'source_code_lifetime> {
    name: &'source_code_lifetime str,
}


这个结构体确实提高了解析器的性能,因为它不需要为标识符分配内存空间。但是有一个新的问题,我如何转换标识符名称?因为现在它使用的是对str的引用。

7uzetpgm

7uzetpgm1#

你描述的正是Cow存在的理由。

struct AstIdentifier<'source_code> {
    name: Cow<'source_code, str>
}

字符串
初始存储&str

impl AstIdentifier<'_> {
    fn new(name: &str) -> Self {
        Self { name: name.into() }
    }
}


你可以使用to_mut来转换为Cow::Owned(如果它还不是),并返回一个对字符串的可变引用:

ast_identifier.name.to_mut().push_str("_some_more");

相关问题