我正在研究提供一个特征的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,
};
是否有一个很好的模式可以使它更符合人体工程学,而不必指定虚拟特征隐喻?
None
和Some(DefaultHandler)
之间有区别吗?
如果没有,我将使handler
的类型为H
,并可能要求用户指定DefaultHandler
(而不是None
)。
[第二,您可以添加一个仅使用new
创建一个MyType<DefaultHandler>
的构造函数handler: DefaultHandler
,此外-对于确实需要自定义处理程序的调用者,您可以添加一个构造函数new_with_handler
接受自定义处理程序作为参数,然后将其用于创建具有相应MyType
的handler
。