如何拥有一个接受来自另一个变量的闭包调用方法的结构?



所以我今年正在做代码的出现,我遇到了一个借用问题:

如何拥有一个接受来自另一个变量的闭包调用方法的结构?这是我设法想出的一个最小例子。借用检查器不喜欢两个闭包都借用值。

如果我在价值观周围有一个互斥锁,那么它似乎有效,但我希望有一个更优雅的解决方案。

从本质上讲,我希望拥有具有不同输入/输出功能的不同大脑,其中一个可能只打印输出,另一个可能向 vec 添加输出。

游乐场链接。

我使用它的实际代码。

struct Brain<I, O>
where
I: Fn() -> i32,
O: FnMut(i32),
{
input: I,
output: O,
}
impl<I, O> Brain<I, O>
where
I: Fn() -> i32,
O: FnMut(i32),
{
fn new(input: I, output: O) -> Self {
Brain { input, output }
}
}
fn runner() {
let mut values = Vec::new();
let request_input = || *values.last().unwrap();
let add_output = |v| values.push(v);
let _ = Brain::new(request_input, add_output);
}

你做错了,你显然不能在 rust 中这样做,你只能有一个可变引用或一个或多个引用,但不能同时拥有两者。与其使用像MutexCell这样的内部可变性,我建议你使用一个特征,例如你可以这样做:

trait Bus {
fn input(&self) -> i32;
fn output(&mut self, v: i32);
}
struct Brain<T>
where
T: Bus,
{
bus: T,
}
impl<T> Brain<T>
where
T: Bus,
{
fn new(bus: T) -> Self {
Brain { bus }
}
}
struct MyBus {
values: Vec<i32>,
}
impl Bus for MyBus {
fn input(&self) -> i32 {
*self.values.last().unwrap()
}
fn output(&mut self, v: i32) {
self.values.push(v)
}
}
fn main() {
let bus = MyBus { values: Vec::new() };
let _ = Brain::new(bus);
}

这提供了很大的灵活性。

最新更新