让我们想象一下,我们有一个非常简单的AST编程语言,只有函数和调用
use std::sync::Arc;
struct Function {
pub body: Vec<Call>
}
struct Call {
pub function: Arc<Function>
}
现在我们要递归调用函数:
x一个一个一个一个x一个一个二个x
可以使用Arc<Mutex<_>>
或Call
中的Arc<RwLock<_>>
来解决该问题:
use std::sync::{Arc, RwLock}
struct Call {
pub function: Arc<RwLock<Function>>
}
然后创建:
let f = Arc::new(RwLock::new(Function { body: vec![] }));
f.write().unwrap().body.push(Call { function: f.clone() })
但是现在你需要在任何地方都写f.write().unwrap()
或f.read().unwrap()
,即使函数是可变的只在构造时。
你能做点比这更好的吗?
1条答案
按热度按时间6qfn3psc1#
使用
Weak
作为父指针。无论如何,您都需要这样做以允许正确的销毁。然后使用Arc::new_cyclic()
: