此问题在此处已有答案:
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" }
}
1条答案
按热度按时间bmp9r5qi1#
关于方法1:考虑一下如果添加以下impl会发生什么情况:
String
本身实现了std::fmt::debug
,因此它将与impl<S:Something> std::fmt::Debug for S
冲突(其中S
可以被String
替代)Rust应该在这里做什么?Rust决定禁止这个场景。