Реализация внешней черты для локального универсального типа - PullRequest
3 голосов
/ 16 октября 2019

Я пытаюсь реализовать черту из ящика А для черты из ящика В с помощью статической отправки. Я обертываю чужую черту, но у меня возникают проблемы со строкой impl<T>:

extern crate a;
extern crate b;

pub trait C: a::A {}

impl<T: C> b::B for T {}

Конечный результат, который я ищу, - это реализация b::B для разработчиков черты C, используя статическую диспетчеризацию.

Я получаю следующую ошибку:

error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
 --> c/src/lib.rs:3:1
  |
3 | impl<T: C> b::B for T {}
  | ^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
  |
  = note: only traits defined in the current crate can be implemented for a type parameter

Я могу обойти это с помощью динамической диспетчеризации - impl b::B for dyn C - но хочучтобы сделать это с помощью статической диспетчеризации.

Я уже пробовал:

1 Ответ

1 голос
/ 18 октября 2019

Что я обычно делаю, так это оборачиваю сторонний тип в struct (в отличие от ввода нового trait, производного от чужого):

extern crate a;
extern crate b;

pub struct C<T: a::A> {
    pub t: T,
}

impl<T: a::A> b::B for C<T> {}

Это, однако, иногда требует некоторогошаблон для преобразования между C и «нормальным» типом.

Это иногда называют «шаблоном NewType» (как в https://github.com/Ixrec/rust-orphan-rules).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...