有时在Rust中,实现特征的类型取决于平台的特定行为,因此不可能仅通过特征接口来完全完全地处理它们。在这种情况下,一次实现通用代码以及在每种具体类型上实现特定于平台的代码将很有用。
例如:
trait IncompleteInterface {}
struct PlatformA;
struct PlatformB;
impl IncompleteInterface for PlatformA {}
impl IncompleteInterface for PlatformB {}
impl PlatformA {
fn baz() {}
}
impl PlatformB {
fn fizz() {}
fn buzz() {}
}
struct PlatformDependent<T: IncompleteInterface>(T);
impl<T /* Constrain to PlatformA and PlatformB */> PlatformDependent<T> {
fn foo() {
Self::bar();
}
}
impl PlatformDependent<PlatformA> {
fn bar(&self) {
self.0.baz();
}
}
impl PlatformDependent<PlatformB> {
fn bar(&self) {
self.0.fizz();
self.0.buzz();
}
}
没有约束,则无法编译,因为编译器无法确定PlatformDependent::baz()
的适当实现。例如,如果某人实现了impl IncompleteInterface for PlatformC {}
,那么显然PlatformDependent<C>(platformC).bar()
无效。
有没有办法告诉编译器一般实现仅适用于平台A和B?