rust Debug/Display的默认实现,用于实现局部trait的结构[duplicate]

pu82cl6c  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(114)

此问题在此处已有答案

How to implement a trait for another trait in rust?(2个答案)
Can't implement a trait I don't own for all types that implement a trait I do own(2个答案)
18小时前关门了。
假设我有一个trait,它有一个name()方法:

pub trait Something {
    fn name() -> &'static str;
}

我想为Debug和Display提供一个默认的实现,用于实现特定的本地trait。我希望debug/display在本地trait上使用一个方法。我提出了两种方法,但都不起作用。
Playground Link
我理解为什么方法2(supertrait with method)不起作用,所以我不会在这里包含它。
方法1(粘贴在下面)看起来可能与孤儿规则有关,除了它是绑定的局部特征。似乎应该有一种方法来做到这一点。

pub trait Something: std::fmt::Debug {
    fn name() -> &'static str;
}
impl<S:Something> std::fmt::Debug for S { // Error: type parameter `S` must be used as the type parameter for some local type
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", S::name())
    }
}
struct Test1 {}
impl Test1 {
    fn name() -> &'static str { "TestA" }
}
bmp9r5qi

bmp9r5qi1#

关于方法1:考虑一下如果添加以下impl会发生什么情况:

impl Something for String {
    fn name() -> &'static str {
        ""
    }
}

String本身实现了std::fmt::debug,因此它将与impl<S:Something> std::fmt::Debug for S冲突(其中S可以被String替代)
Rust应该在这里做什么?Rust决定禁止这个场景。

相关问题