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

时间:2017-06-13 10:53:48

标签: rust traits mutability

我有以下片段的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个mut。我可以以某种方式将这些变成一个函数,根据self的可变性,导出我返回的引用的可变性吗?是否有某种特性我可以使用或类似?

1 个答案:

答案 0 :(得分:5)

你不可能有一个功能来实现这一目标。但是,实际上(并API guidelines推荐)为此目的使用相同函数的_mut变体是实际的:

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]
}