假设有一个特质,其所有方法仅接受自身的引用
此外,实现方式完全相同。有没有更加简洁的方法来完成这个任务?
self
,例如:trait Trait {
fn foo(&self) -> i32;
}
我希望这个特性能够同时适用于Option<T>
和Option<&T>
(因为我并不总是需要所有权),并且可以使用一种简单的实现方式,例如:
impl<T: Trait> Trait for Option<T> {
fn foo(&self) -> i32 {
if let Some(inner) = self { return inner.foo(); }
0
}
}
impl<T: Trait> Trait for Option<&T> {
fn foo(&self) -> i32 {
if let Some(inner) = self { return inner.foo(); }
0
}
}
然而,这样做会产生以下错误:
error[E0119]: conflicting implementations of trait `Trait` for type `std::option::Option<&_>`:
--> option.rs:12:1
|
5 | impl<T: Trait> Trait for Option<T> {
| ---------------------------------- first implementation here
...
12 | impl<T: Trait> Trait for Option<&T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `std::option::Option<&_>`
|
= note: downstream crates may implement trait `Trait` for type `&_`
此外,实现方式完全相同。有没有更加简洁的方法来完成这个任务?
Option<T>
实现这个特质,其中T
是任何可以应用.foo()
方法的类型,即如果bar
是T
的一个实例,则调用bar.foo()
是有效的。 - cripplejaybOption<&T>
实现您的trait,并记录这样一个事实:要想将其与Option<T>
一起使用,用户必须首先调用as_ref
。严格来说,这不是解决方案,因此我不会将其发布为答案,但它可能很有用。 - CerberusOption<T>
字段的结构体上使用derive
宏来自动派生特性。 - cripplejayb