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

前兔子

因此,这几年我正在编写代码,遇到了一个借用问题:

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

如果我在值周围有一个互斥锁,那么它似乎可以工作,但是我希望有一个更优雅的解决方案。

本质上,我想让不同的大脑具有不同的输入/输出功能,其中一个可能只是打印输出,另一个可能正在将输出添加到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);
}

星际战士

您做错了,您显然不能完全做到这一点,您只能拥有一个可变参考或一个或多个参考,但不能同时拥有这两个参考。建议您不要使用特征,而不是使用内部可变性,例如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);
}

这提供了很大的灵活性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何创建一个使用闭包对象作为参数调用(或组合)另一个Expression的Expression?

来自分类Dev

extjs-如何从另一个控制器或闭包中正确调用控制器方法

来自分类Dev

根据另一个闭包来定义一个闭包

来自分类Dev

如何将闭包附加到另一个闭包?

来自分类Dev

如何将Rust与wasm-bindgen一起使用,以创建一个带有状态的另一个闭包的闭包?

来自分类Dev

如何在另一个集合中拥有一个集合?

来自分类Dev

当另一个调用 lambda 使用默认捕获时,可以破坏 lambda 的闭包?

来自分类Dev

为什么允许通过原型继承访问另一个闭包范围内的私有变量?

来自分类Dev

如何从另一个类中迅速调用另一个方法?

来自分类Dev

如何创建一个使用闭包对象作为参数调用(或与另一个表达式组合)的Expression?

来自分类Dev

RunST防止在闭包中访问另一个有状态线程的引用

来自分类Dev

如何从一个公共方法中提取变量的值并调用另一个方法

来自分类Dev

groovy ..将闭包作为参数传递给另一个闭包

来自分类Dev

DropDownList拥有另一个价值

来自分类Dev

build.gradle如何应用另一个文件的闭包

来自分类Dev

如何从另一个类调用@selector方法

来自分类Dev

Flutter:如何从另一个类调用方法?

来自分类Dev

如何从另一个小写的类调用方法?

来自分类Dev

如何从另一个类调用@selector方法

来自分类Dev

如何从另一个类调用get方法?

来自分类Dev

如何从另一个类调用void方法

来自分类Dev

如何从另一个线程调用控制方法

来自分类Dev

如何从另一个类调用 invalidate() 方法?

来自分类Dev

如何从另一个类调用方法?

来自分类Dev

如何从另一个项目调用类的方法

来自分类Dev

如何从另一个片段调用方法

来自分类Dev

如何从另一个类调用HashMap的方法?

来自分类Dev

如何从另一个窗口调用 MainWindow 方法?

来自分类Dev

如何在一个文件中调用一个声明的变量到另一个文件?

Related 相关文章

  1. 1

    如何创建一个使用闭包对象作为参数调用(或组合)另一个Expression的Expression?

  2. 2

    extjs-如何从另一个控制器或闭包中正确调用控制器方法

  3. 3

    根据另一个闭包来定义一个闭包

  4. 4

    如何将闭包附加到另一个闭包?

  5. 5

    如何将Rust与wasm-bindgen一起使用,以创建一个带有状态的另一个闭包的闭包?

  6. 6

    如何在另一个集合中拥有一个集合?

  7. 7

    当另一个调用 lambda 使用默认捕获时,可以破坏 lambda 的闭包?

  8. 8

    为什么允许通过原型继承访问另一个闭包范围内的私有变量?

  9. 9

    如何从另一个类中迅速调用另一个方法?

  10. 10

    如何创建一个使用闭包对象作为参数调用(或与另一个表达式组合)的Expression?

  11. 11

    RunST防止在闭包中访问另一个有状态线程的引用

  12. 12

    如何从一个公共方法中提取变量的值并调用另一个方法

  13. 13

    groovy ..将闭包作为参数传递给另一个闭包

  14. 14

    DropDownList拥有另一个价值

  15. 15

    build.gradle如何应用另一个文件的闭包

  16. 16

    如何从另一个类调用@selector方法

  17. 17

    Flutter:如何从另一个类调用方法?

  18. 18

    如何从另一个小写的类调用方法?

  19. 19

    如何从另一个类调用@selector方法

  20. 20

    如何从另一个类调用get方法?

  21. 21

    如何从另一个类调用void方法

  22. 22

    如何从另一个线程调用控制方法

  23. 23

    如何从另一个类调用 invalidate() 方法?

  24. 24

    如何从另一个类调用方法?

  25. 25

    如何从另一个项目调用类的方法

  26. 26

    如何从另一个片段调用方法

  27. 27

    如何从另一个类调用HashMap的方法?

  28. 28

    如何从另一个窗口调用 MainWindow 方法?

  29. 29

    如何在一个文件中调用一个声明的变量到另一个文件?

热门标签

归档