簡體   English   中英

如何在 Rust 中創建緩存 object 工廠?

[英]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())
}

變量af object 中包含的引用。 只要你有a引用,你就不能修改f因為它已經被 a 別名a 我認為解決這個問題的最好方法是在FormulaFactory結構中有一個FormulaVec稱為formulas (為了簡單起見),並且只給出FormulaIndex對象,它只是一個usize表示formulas字段中Formula的索引. 這與petgraph采用的方法相同,其中Graph中的nodes字段包含NodeVec ,但Graph api 僅給出NodeIndex對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM