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

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 去游乐场

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

你不能在同一个链中混合使用,因为你的非消费方法只有 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();