我正在将我编写的编译器移植到 Rust。在其中,我有一个枚举Entity,它代表函数和变量之类的东西:
pub enum Entity<'a> {
Variable(VariableEntity),
Function(FunctionEntity<'a>)
// Room for more later.
}
Run Code Online (Sandbox Code Playgroud)
然后,我有一个结构体Scope,负责在哈希映射中保存这些实体,其中键是程序员为实体指定的名称。(例如,声明一个名为 name 的函数sin会将 an 放Entity入哈希映射中的 key 处sin。)
pub struct Scope<'a> {
symbols: HashMap<String, Entity<'a>>,
parent: Option<&'a Scope<'a>>
}
Run Code Online (Sandbox Code Playgroud)
我希望能够获得对 HashMap 中对象的只读引用,以便我可以从其他数据结构中引用它。例如,当我解析函数调用时,我希望能够存储对正在调用的函数的引用,而不仅仅是存储函数的名称,并且每次需要对应的实际对象时都必须查找Entity引用到名字。为此,我制定了以下方法:
impl<'a> Scope<'a> {
pub fn lookup(&self, symbol: &str) -> Option<&'a Entity<'a>> {
let result = self.symbols.get(symbol);
match result {
Option::None => match self.parent {
Option::None => Option::None,
Option::Some(parent) => parent.lookup(symbol),
},
Option::Some(_value) => …Run Code Online (Sandbox Code Playgroud)