gpt4 book ai didi

rust - 为Option 和Option <&T>实现特征

转载 作者:行者123 更新时间:2023-12-03 11:40:55 25 4
gpt4 key购买 nike

假设有一个特质,其所有方法都只引用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 `&_`

而且,实现方式实际上是相同的。有可能以更紧凑的方式做到这一点吗?

最佳答案

这不会编译,因为作为您特质的用户,我可以执行以下操作:

struct Yo;

impl Trait for Yo {
fn foo(&self) -> i32 { 0 }
}
impl Trait for &Yo {
fn foo(&self) -> i32 { 1 }
}

fn main() {
let a = Yo;
let b: Option<&Yo> = Some(&a);
b.foo(); // ambiguous call!
}

对于 Option<&Yo>,您的特征有两种相互矛盾的实现!不幸的是,特质特化仍然不稳定,因此这可能不是一个选择。

在您的特定情况下,如果您愿意,可以使用以下通用 impl解决:
impl<T: Trait> Trait for &T {
fn foo(&self) -> i32 {
(*self).foo()
}
}

这与您对 Option<T>的通用隐式实现相结合,将为 Option<&T>提供明确的实现。

关于rust - 为Option <T>和Option <&T>实现特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59554366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com