代码之家  ›  专栏  ›  技术社区  ›  MB-F

为什么可以同时实现“T:Display”和“str”的特性?

  •  12
  • MB-F  · 技术社区  · 7 年前

    specialization stable Rust yet ,所以这不起作用:

    trait X {}
    
    impl<T> X for T {}
    impl X for u32 {}  // conflicting implementation
    

    没有什么奇怪的: X 是为任何类型实现的 T 我们不能再实施了 u32

    令人惊讶的是,以下代码段编译成功:

    use std::fmt::Display;
    
    pub trait Show {}
    
    impl<T: Display> Show for T {}
    
    impl Show for str {}
    
    // These impls would cause "conflicting implementation" errors:
    // impl<'a> Show for &'a str
    // impl Show for String
    
    fn main() {}
    

    我不希望这段代码编译,因为 Display is implemented for str ,因此泛型impl应该实现 Show 对于 str公司 并与具体实施相冲突。

    为什么会这样 impl Show for str 不与冲突 impl<T: Display> Show for T

    1 回复  |  直到 7 年前
        1
  •  15
  •   kennytm    7 年前

    束缚 <T: Display> T 必须是大小类型。然而 str unsized . 因此,这两个impl并不冲突。

    如果你需要包括像 str公司 同样,您需要通过添加 T: ?Sized :

    impl<T: Display + ?Sized> Show for T {}
    //              ^~~~~~~~
    
    推荐文章