我如何创建一个允许非消耗和消耗函数的构建器
how can I create a builder which allows non-consuming and consuming functions
我想为表示分析事件的结构创建构建器。一旦事件被“发送”,构建器就应该被消耗。
我读了这篇入门书:
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) {
/// ....
}
}
link 去游乐场
你不能在同一个链中混合使用,因为你的非消费方法只有 return &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();
我想为表示分析事件的结构创建构建器。一旦事件被“发送”,构建器就应该被消耗。
我读了这篇入门书:
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) {
/// ....
}
}
link 去游乐场
你不能在同一个链中混合使用,因为你的非消费方法只有 return &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();