![](/img/trans.png)
[英]How can I serialise Rust object to Rust literals using serde?
[英]How can I create a caching object factory in Rust?
我想用 Rust 為 boolean 公式開發一個庫,我對 Rust 很陌生。
這個想法是擁有由(顯然是可變的)公式工廠創建和緩存的不可變公式。 因此,用戶將首先創建一個公式工廠,然后使用它來創建作為引用返回的公式。
問題是編譯器基本上不允許我創建多個公式,因為這意味着公式工廠 object 的可變借用不止一個。
let mut f = FormulaFactory::new();
let a = f.variable("a");
let b = f.variable("b"); // error: cannot borrow `f` as mutable more than once at a time
let ab = f.and(a, b);
我理解這種違反規則的行為,但另一方面,我認為在這種情況下一切都會好起來的(至少在單線程設置中)。 有沒有一種簡單的方法來解決這個問題,還是我寧願考慮一種不同的、更兼容 rust 的方法?
更多信息: 'static
生命周期不是目標場景中的選項。 用戶可能想要創建多個公式工廠,尤其是在不再需要公式時刪除它們。
僅供參考一個最小的例子(非常簡化 - 顯然一個Formula
也將有一個公式類型,在這個例子中只有變量和連詞):
#![feature(hash_set_entry)]
use std::collections::HashSet;
#[derive(PartialEq, Eq, Hash)]
pub struct Formula<'a> {
variable: Option<&'a str>,
operands: Vec<&'a Formula<'a>>,
}
pub struct FormulaFactory<'a> {
variables: HashSet<Formula<'a>>,
conjunctions: HashSet<Formula<'a>>,
}
impl<'a> FormulaFactory<'a> {
pub fn new() -> FormulaFactory<'a> {
FormulaFactory {
variables: HashSet::new(),
conjunctions: HashSet::new(),
}
}
pub fn variable(&mut self, name: &'a str) -> &Formula<'a> {
(&mut self.variables).get_or_insert(Formula{variable: Some(name), operands: vec![]})
}
pub fn and(&mut self, op1: &'a Formula<'a>, op2: &'a Formula<'a>) -> &Formula<'a> {
(&mut self.conjunctions).get_or_insert(Formula{variable: None, operands: vec![op1, op2]})
}
}
fn main() {
let mut f = FormulaFactory::new();
let a = f.variable("a");
let b = f.variable("b"); // error: cannot borrow `f` as mutable more than once at a time
let ab = f.and(a, b);
println!("{}", ab.operands[0].variable.unwrap())
}
變量a
是f
object 中包含的引用。 只要你有a
引用,你就不能修改f
因為它已經被 a 別名a
。 我認為解決這個問題的最好方法是在FormulaFactory
結構中有一個Formula
的Vec
稱為formulas
(為了簡單起見),並且只給出FormulaIndex
對象,它只是一個usize
表示formulas
字段中Formula
的索引. 這與petgraph采用的方法相同,其中Graph
中的nodes
字段包含Node
的Vec
,但Graph
api 僅給出NodeIndex
對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.