如何在循环中使用链式构建器模式而不产生编译器错误?

2024-04-11

如何正确使用期望的构建器模式方法链接 https://en.wikipedia.org/wiki/Method_chaining在循环中?使用来自的示例log4rs https://crates.io/crates/log4rs。注意self不是一个参考appender.

//builder pattern from log4rs

pub struct ConfigBuilder {
    appenders: Vec<Appender>,
    loggers: Vec<Logger>,
}

impl ConfigBuilder {
    pub fn appender(mut self, appender: Appender) -> ConfigBuilder {
        self.appenders.push(appender);
        self
    }
}

在下面执行此操作会导致错误,因为(我认为)cb正在移动到返回的内存.appender().

let cb = ConfigBuilder::new();
for x in ys {
    cb.appender(x);
}

下面的这个似乎有效。这是唯一的方法吗?

let mut cb = ConfigBuilder::new();
for x in ys {
    cb = cb.appender(x);
}

这是唯一的方法吗?

从语义上讲,它是关键方式,尽管还有其他方式来编写它。这appender函数需要mut self所以它将取得所有权cb变量的值并使该变量在该点之后不可用。它本来可以被设计为借用参考,但链接很好。由于您处于循环中,因此构建器需要在下一次迭代中可用,因此您需要将值分配给新的内容。这意味着

let mut cb = ConfigBuilder::new();
for x in ys {
    cb = cb.appender(x);
}

确实是一种方法。另一种方法是使用Iterator's .fold https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.fold to do

let cb = ys.into_iter()
  .fold(ConfigBuilder::new(), |cb, x| cb.appender(x));

它将所有内容保留在一项作业中,但其他方面几乎相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在循环中使用链式构建器模式而不产生编译器错误? 的相关文章

随机推荐

  • 使用 xmllint 添加属性

    我想向标签添加一个属性 使用xmllint 我可以通过 xmllint 做到这一点吗 Xmllint 不是用来编辑 XML 的 所以我认为答案是 不 你不能 要编辑 XML 您可以使用 XMLStarlet 向现有 XML 文档添加属性的语
  • 无法从视图中的异步方法返回值

    我正在尝试从中返回值asynchtml 帮助器 但它给出以下字符串而不是所需的值 System Threading Tasks Task WhenAllPromise 1 System Decimal Method public async
  • 由于 zend 路线,zend 导航无法工作

    EDIT 该问题是由于 zend 路由引起的 请检查更新 我正在使用 xml 文件进行导航 编辑 以下代码来自layout phtml文件 config new Zend Config Xml APPLICATION PATH config
  • 您可以从 EntityListener 访问 EntityManager 吗?

    我知道 JSR 000220 Enterprise JavaBeans 3 0 Final Release 持久性 规范指出 一般来说 便携式应用程序不应调用 EntityManager 或查询操作 访问其他实体实例 或修改生命周期回调方法
  • 安装 Laravel 时出现错误:“./composer.json 不可写。”

    这是我运行的命令 composer global require laravel installer 这是我之后得到的文本和错误 Changed current directory to home dimitar composer comp
  • 使用 OpenCV 改进图像中的矩形轮廓检测

    我正在尝试检测给定图像中的矩形框 Original image but the image is not good enough to detect rectangles how can i improve it and detect al
  • Python 单元测试输出数据

    如果我用 Python 编写单元测试 使用 unittest 模块 是否可以输出失败测试的数据 以便我可以检查它以帮助推断导致错误的原因 我知道创建自定义消息的能力 它可以携带一些信息 但有时您可能会处理更复杂的数据 这些数据无法轻松表示为
  • 代号 1 个 JavaScript 回调

    我正在尝试在我的应用程序中显示同意页面 该页面应该用 html 编写 因此应用程序需要处理来自浏览器的按钮单击事件 我尝试复制博客中的例子 https www codenameone com blog new async java java
  • 如何将自定义图形适合boost图形库模板?

    我对 C 模板很生疏 而且我正在使用 boost 图形库 一个致命的组合 我在网上搜索过 但找不到任何关于如何采用自定义图形结构并将其足够适合 BGL 增强图形库 的直接说明 以便我可以使用增强图形遍历算法 有熟悉图书馆的人可以帮助我吗 编
  • 我可以更改 Firebug 控制台背景颜色吗?

    我更喜欢 Firebug 窗口具有深色背景颜色和浅色文本 或者甚至只是灰色背景而不是白色就足够了 有什么办法可以做到这一点 无论是通过调整 firebug 的原始文件还是通过使用扩展 这是一个不错的 firebug 深色主题 仅适用于 Fi
  • Visual Studio 错误:已添加具有相同键的项目

    当我尝试更改控件的默认图像时在 Windows 窗体上在表单设计器中 无论在哪个控件上的哪个位置 我收到此错误 错误消息 具有相同的项目 密钥已经添加 我尝试删除并重新创建资源 resx文件 我保证只有 1 个带有这些键的 resx 文件存
  • 在 PHP 8 上安装 apcu_bc 包时遇到问题

    安装包时遇到以下错误pecl install apcu bc在 PHP 8 上 In file included from tmp pear temp apcu bc php apc c 35 usr local include php e
  • 如何从滚动视图中删除子视图?

    我如何从滚动视图中删除所有子视图 我在滚动视图中有一个 uiview 和它上面的一个按钮 像这样 这是我在滚动视图中添加子视图的代码 void AddOneButton NSInteger myButtonTag lastButtonNum
  • java.util.regex.Pattern 可以进行部分匹配吗?

    是否可以知道流 字符串是否包含以下输入 could匹配正则表达式 例如 String input AA Pattern pat Pattern compile AAAAAB Matcher matcher pat matcher input
  • 按名称访问 ResourceDictionary

    假设我的 Application xaml 中有一些 ResourceDictionary 定义如下
  • django-reversion 撤消功能 - 恢复多个对象

    我正在尝试使用 django reversion 在 django 项目中实现 撤消 功能 以防用户意外修改多个对象 使用管理面板不起作用 因为必须一一恢复对象 我的问题是我无法创建包含多个对象数据的修订版本 即使当我这样做时 with r
  • React + Antd + Rollup 组件库“错误:无效的钩子调用。钩子只能在函数组件体内调用”

    我目前正在构建一个 UI 库来简化跨多个应用程序的维护 这些目前使用 Ant Design 一切似乎都很顺利 我在两者中都添加了我的对等依赖项package json and rollup config js 通过外部 我能够让 Rollu
  • 来自 Parcel.readException 的 NullPointerException (等)

    看起来像这样的异常令人困惑 FATAL EXCEPTION main java lang NullPointerException at android os Parcel readException Parcel java 1437 at
  • 导航抽屉 - 带 ListView 的标题视图

    我目前正在创建和定义一个导航抽屉 我现在想要一个标题视图 就像它们在谷歌应用程序上一样 位于项目行上方 我只找到了 RecyclerViews 的示例 但我不想使用它 我已经完成了 ListView 和所有其他东西 也许有人可以帮助我 提前
  • 如何在循环中使用链式构建器模式而不产生编译器错误?

    如何正确使用期望的构建器模式方法链接 https en wikipedia org wiki Method chaining在循环中 使用来自的示例log4rs https crates io crates log4rs 注意self不是一