我想为表示分析事件的结构创建一个生成器。一旦事件是";发送";构建器应该被消耗掉。
我读过这本入门书:
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();