TL; DR: Вы не можете.
Вы не можете реализовать FromStr
для dyn SomeTrait
, потому что у него есть метод, который возвращает Result<Self, _>
, следовательно, вы можете реализовать только это для типов, размер которых известен во время компиляции, что не относится к объектам черт.
Что вам действительно нужно, так это
impl<T: MyGoodTrait> FromStr for T
Но теперь вы можете нарушить правило-сироту. Как объясняет компилятор:
Реализация чужой черты возможна, только если хотя бы один из типов, для которого она реализована, является локальным. Только параметры, определенные в текущем ящике, могут быть реализованы для параметра типа.
Но вы можете сделать это, если вместо этого FromStr
была локальная черта:
/// Copy of `std::str::FromStr`
trait Foo: Sized {
type Err;
fn from_str(s: &str) -> Result<Self, Self::Err>;
}
impl<T: MyGoodTrait> Foo for T {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(Self::new())
}
}
Или вы может реализовать его для любого определенного c локального типа:
impl FromStr for A {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(Self::new())
}
}