gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:03:49 31 4
gpt4 key购买 nike

您如何正确使用期望 method chaining 的构建器模式在一个循环中?使用 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);
}

最佳答案

Is this the only way to do it?

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

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

确实是一种方法。另一种方法是使用 Iterator's .fold

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

它将所有内容都保存在一个赋值中,但在其他方面几乎相同。

关于rust - 如何在循环中使用链式构建器模式而不产生编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45517265/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com