如何创建一个允许非消耗和消耗函数的生成器



我想为表示分析事件的结构创建一个生成器。一旦事件是";发送";构建器应该被消耗掉。

我读过这本入门书:

https://doc.rust-lang.org/1.0.0/style/ownership/builders.html

因此,为了允许在没有重新分配的情况下进行简单的链接(这可能是必需的,因为有许多执行分支(,我的构建器看起来像这样(简化的(

pub struct AnalyticsEvent {
}
impl AnalyticsEvent {
pub fn new() -> Self {
AnalyticsEvent { }
}
pub fn add_property(&mut self) -> &mut AnalyticsEvent {
self
}
// now I want the "send" to consume the event
pub fn send(self) {
/// ....
}
}

链接到操场

https://play.rust-lang.org/?version=stable&mode=调试&edition=2018&gist=fbe9e261a419608f2c592799f22ba9f9

不能将两者混合在同一个链中,因为非消耗方法只返回&mut T,所以无法对它们调用self消耗方法。

因此,要么保持构建器界面不变,要么替换

event.add_property().send();

通过

event.add_property();
event.send();

或者更改构建器接口以始终处理所拥有的对象,在某些情况下需要进行奇怪的重新分配。

在后一种情况下,您可以通过添加方便的方法来缓解问题,例如map,它将包含条件情况:

event.add_property()
.add_property()
.map(|e| if condition {
e.add_property()
} else {
e
})
.add_property()
.send();

相关内容

  • 没有找到相关文章

最新更新