当 self 可变时返回可变引用,否则引用

Returning mutable reference when self is mutable, otherwise reference

我有以下 Rust 代码片段:

pub fn scope(&mut self) -> &mut HashMap<String, Type> {
    let idx = self.vars.len() - 1;
    &mut self.vars[idx]
}

我意识到在某些情况下我想将此函数与函数的非可变版本一起使用,例如:

pub fn scope(&self) -> &HashMap<String, Type> {
    let idx = self.vars.len() - 1;
    &self.vars[idx]
}

两个函数之间只删除了 3 muts。我能否以某种方式将它们转换为一个函数,该函数根据 self 的可变性导出我返回的引用的可变性?是否有某种我可以利用或类似的特征?

你不可能有一个单一的功能来实现这一点。然而,为了这个目的,使用相同函数的 _mut 个变体实际上是常规的(并且由 API guidelines 推荐):

pub fn scope(&self) -> &HashMap<String, Type> {
    let idx = self.vars.len() - 1;
    &self.vars[idx]
}

pub fn scope_mut(&mut self) -> &mut HashMap<String, Type> {
    let idx = self.vars.len() - 1;
    &mut self.vars[idx]
}