Rust API设计:可选值的类型参数

问题描述 投票:1回答:1

我正在研究提供一个特征的Rust库,该特征可以由用户可选地实现。它看起来可能像这样:

pub trait MyHandler {
    fn do_something(&mut self);
}

库中的主要结构看起来像这样:

pub struct MyType<H: MyHandler {
    field_a: u8,
    field_b: u32,
    handler: Option<H>,
}

这是可行的,但实际上,只有极少数的用户会实现自定义处理程序。从人机工程学的角度来看,即使没有传入任何处理程序,也总是需要指定类型H

let t = MyType {
    field_a: 1,
    field_b: 3000,
    handler: None,
};
error[E0282]: type annotations needed for `MyType<H>`
  --> src/main.rs:12:13
   |
12 |     let t = MyType {
   |         -   ^^^^^^ cannot infer type for type parameter `H` declared on the struct `MyType`
   |         |
   |         consider giving `t` the explicit type `MyType<H>`, where the type parameter `H` is specified

该库可以做的所有简化操作,就是提供一个可以由用户指定的虚拟实现:

pub struct DefaultHandler {}

impl MyHandler for DefaultHandler {
    fn do_something(&mut self) {}
}
let t = MyType::<DefaultHandler> {
    field_a: 1,
    field_b: 3000,
    handler: None,
};

是否有一个很好的模式可以使它更符合人体工程学,而不必指定虚拟特征隐喻?

generics rust api-design
1个回答
0
投票

NoneSome(DefaultHandler)之间有区别吗?

如果没有,我将使handler的类型为H,并可能要求用户指定DefaultHandler(而不是None)。

[第二,您可以添加一个仅使用new创建一个MyType<DefaultHandler>的构造函数handler: DefaultHandler,此外-对于确实需要自定义处理程序的调用者,您可以添加一个构造函数new_with_handler接受自定义处理程序作为参数,然后将其用于创建具有相应MyTypehandler

© www.soinside.com 2019 - 2024. All rights reserved.