什么算是冲突的实现

  • 本文关键字:实现 冲突 rust
  • 更新时间 :
  • 英文 :


在以下代码中:

enum Either<A, B> { Left(A), Right(B) }
use Either::{Left, Right};
impl<A, B> From<A> for Either<A, B> {
fn from(a: A) -> Self {
Left(a)
}
}
impl<A, B> From<B> for Either<A, B> {
fn from(b: B) -> Self {
Right(b)
}
}

我得到以下错误:;特征CCD_ 1对于类型CCD_;。我不明白From<A>From<B>对于Either<A, B>的实现是如何冲突的。

我在标准库文档中看到了一个例子,他们所做的几乎与我所做的完全一样,但它在那里有效:

use std::fs;
use std::io;
use std::num;
enum CliError {
IoError(io::Error),
ParseError(num::ParseIntError),
}
impl From<io::Error> for CliError {
fn from(error: io::Error) -> Self {
CliError::IoError(error)
}
}
impl From<num::ParseIntError> for CliError {
fn from(error: num::ParseIntError) -> Self {
CliError::ParseError(error)
}
}

有人能解释一下吗?谢谢

在原始代码中:

enum Either<A, B> { Left(A), Right(B) }
use Either::{Left, Right};
impl<A, B> From<A> for Either<A, B> {
fn from(a: A) -> Self {
Left(a)
}
}
impl<A, B> From<B> for Either<A, B> {
fn from(b: B) -> Self {
Right(b)
}
}

您为任一<A、 B>From被相同的特征A和B绑定两次。这可能会导致From被多次实现的问题。我无法确认,因为该问题无法从提供的代码中重现。使用提供的代码直接抛出错误,说明A和B未定义。

将原始代码和功能代码结合在一起;我们可以提供类型的定义。但是,由于边界不正确,以下代码仍然会失败。在这种情况下,特征边界由一个结构约束:

use std::{io, num};
enum Either<A, B> { Left(A), Right(B) }
use Either::{Left, Right};
impl<A: io::Error, B: num::ParseIntError> From<A> for Either<A, B> {
fn from(a: A) -> Self {
Left(a)
}
}
impl<A: io::Error, B: num::ParseIntError> From<B> for Either<A, B> {
fn from(b: B) -> Self {
Right(b)
}
}

将导致以下错误:

error[E0404]: expected trait, found struct `num::ParseIntError`

要制作一个函数版本,应该删除特征边界。导致如下内容,编译时不会出现错误:

use std::{io, num};
enum Either<A, B> { Left(A), Right(B) }
type A = io::Error;
type B = num::ParseIntError;
use Either::{Left, Right};
impl From<A> for Either<A, B> {
fn from(a: A) -> Self {
Left(a)
}
}
impl From<B> for Either<A, B> {
fn from(b: B) -> Self {
Right(b)
}
}

From将仅在实现它的类型参数上可用,并且不需要特征边界。

你可以在这里找到更多关于特质界限的信息:https://doc.rust-lang.org/reference/trait-bounds.html

您可以在此处找到有关类型参数的更多信息:https://doc.rust-lang.org/reference/types/parameters.html

您可以在此处找到From特性的文档:https://doc.rust-lang.org/std/convert/trait.From.html

最新更新