如何在Rust中创建缓存对象工厂?

如何在Rust中创建缓存对象工厂?,rust,borrow-checker,Rust,Borrow Checker,我想为生锈的布尔公式开发一个库,我对生锈还很陌生 其思想是拥有由(显然是可变的)公式工厂创建和缓存的不可变公式。因此,用户将首先创建公式工厂,然后使用它创建作为引用返回的公式 问题是编译器基本上不允许我创建多个公式,因为这意味着公式工厂对象有多个可变借用 let mut f=FormulaFactory::new(); 设a=f.变量(“a”); 设b=f.变量(“b”);//错误:不能一次多次借用'f'作为可变项 设ab=f和(a,b); 我理解这种违反规则的行为,但另一方面,我认为在这种情

我想为生锈的布尔公式开发一个库,我对生锈还很陌生

其思想是拥有由(显然是可变的)公式工厂创建和缓存的不可变公式。因此,用户将首先创建公式工厂,然后使用它创建作为引用返回的公式

问题是编译器基本上不允许我创建多个公式,因为这意味着公式工厂对象有多个可变借用

let mut f=FormulaFactory::new();
设a=f.变量(“a”);
设b=f.变量(“b”);//错误:不能一次多次借用'f'作为可变项
设ab=f和(a,b);
我理解这种违反规则的行为,但另一方面,我认为在这种情况下一切都会正常(至少在单线程设置中)。有没有一种简单的方法来解决这个问题,或者我更愿意考虑一种不同的、更适合生锈的方法

更多信息:
“静态”
生存期在目标场景中不是选项。用户可能希望创建多个公式工厂,尤其是在不再需要公式时删除它们

仅供参考一个最小的示例(高度简化–显然,
公式
也会有一个公式类型,在这个示例中,只有变量和连词):

#![特征(散列设置项)]
使用std::collections::HashSet;
#[导出(PartialEq、Eq、Hash)]
发布结构公式,
操作数:Vec>,
}
发布结构公式化工厂>,
连接词:HashSet公式化工厂{
配方工厂{
变量:HashSet::new(),
连接词:HashSet::new(),
}
}
pub fn变量(&mut self,名称:&'a str)->&Formula{
(&mut self.conctions).get_或_insert(公式{变量:无,操作数:vec![op1,op2]})
}
}
fn main(){
让mut f=FormulaFactory::new();
设a=f.变量(“a”);
设b=f.variable(“b”);//错误:不能一次多次借用'f'作为可变项
设ab=f和(a,b);
println!(“{}”,ab.operans[0]。变量。展开()
}

变量
a
f
对象中包含的引用。只要您有
a
的引用,就不能修改
f
,因为它已经被
a
化名了。我认为最好的方法是在
FormulaFactory
结构中使用
formulas
公式的
Vec
(为了简单起见)并仅给出
FormulaIndex
对象,该对象只是
usize
表示
公式
字段中的
公式的索引。这与
图中的
节点
字段包含
节点
向量
时所采用的方法相同,但
api仅给出
节点索引
对象