У меня проблема с дизайном, когда я использую что-то вроде:
trait MyTrait<K: OtherTrait> { ... }
impl<K: OtherTrait, M: MyTrait<K>> AnyTrait for M { ... }
Я не могу реализовать трейт для этого трейта из-за ошибки E207 («параметр типа K
не ограничен трейтом impl, self-типом или предикатами»).
Не находя способа избавиться от этой ошибки, я применяю этот не очень красивый обходной путь (подробный и структурированный без внутренней стоимости):
use std::fmt;
use std::marker::PhantomData;
pub trait MyTrait<K: fmt::Display> {
fn get_some_k(&self) -> Option<K>;
}
/* // This is my target impl but results in E207 due to K not constrained
impl<K: fmt::Display, S: MyTrait<K>> fmt::Display for S {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.get_some_k().unwrap())
}
} */
pub struct Ugly<'a, K: fmt::Display, S: 'a + MyTrait<K>>(&'a S, PhantomData<K>);
impl<'a, K: fmt::Display, S: MyTrait<K>> fmt::Display for Ugly<'a, K, S> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0.get_some_k().unwrap())
}
}
fn main() { }
Я думаю, что должен быть какой-то более приятный способ реализовать трейт для такого параметризованного трейта.
Я не нашел хорошего примера в std (например, нет реализации Display
в чертах со связанным типом, например Iterator
)?
Ugly
, посколькуMyTrait
является общедоступной чертой, доступной для пользователей, и требующей от них использованияUgly
полностью разрушает API, добавляя ненужную сложность. - person mindTree   schedule 02.10.2015