Почему можно реализовать черту для `T: Display` и` str`? - PullRequest
0 голосов
/ 28 сентября 2018

Нет специализации в Стабильный Rust еще , поэтому это не работает:

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 реализовано для str, поэтому универсальный impl должен реализовывать Show для str и конфликтовать с конкретным импл.

Почему impl Show for str не конфликтует с impl<T: Display> Show for T

1 Ответ

0 голосов
/ 28 сентября 2018

Граница <T: Display> неявно предполагает, что T должен иметь тип Sized.Однако str равно без размера .Таким образом, эти два значения не конфликтуют друг с другом.

Если вам необходимо охватить и нестандартные типы, такие как str, вам нужно ослабить требование Sized, добавив T: ?Sized:

impl<T: Display + ?Sized> Show for T {}
//              ^~~~~~~~
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...