为多个通用特征实现一个特征

问题描述 投票:0回答:1

我正在尝试实现

Display
Debug
特征,但 rust 会响应
conflicting implementations

这是我的代码:

pub trait AsString {
    fn as_string(self) -> String;
}

impl<T: Display> AsString for T {
    fn as_string(self) -> String {
        self.to_string()
    }
}

impl<T: Debug> AsString for T {
    fn as_string(self) -> String {
        format!("{:?}", self)
    }
}

但是生锈给了我:

error[E0119]: conflicting implementations of trait `AsString`
  --> src/convert_test_result.rs:43:1
   |
37 | impl<T: Display> AsString for T {
   | ------------------------------- first implementation here
...
43 | impl<T: Debug> AsString for T {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation

如何解决这个问题?

rust traits
1个回答
0
投票

不幸的是,负面特征边界还不是稳定 Rust 的一部分。

如果是的话,你可以这样做:

pub trait AsString {
    fn as_string(self) -> String;
}

impl<T> AsString for T
where
    T: Debug + !Display
{
    fn as_string(self) -> String {
        format!("{:?}", self)
    }
}

impl<T> AsString for T
where
    T: Display + !Debug
{
    fn as_string(self) -> String {
        self.to_string()
    }
}

impl<T> AsString for T
where
    T: Debug + Display
{
    fn as_string(self) -> String {
        // you would have to choose which implementation
        // to use if a type is both Display and Debug
    }
}

但是,您提供的示例永远不会按照您编写的方式运行。

© www.soinside.com 2019 - 2024. All rights reserved.