То, что impl Component
в качестве возвращаемого типа, в основном равно T where T: Component
, где T
выбирается самой функцией, а не вызывающей стороной.
T
может быть Kind
,T
может быть Location
, но T
не может быть одновременно одновременно.
Два решения:
Динамически: вернуть Box<dyn Component>
ивозврат Box::new(Kind{})
или Box::new(Location{})
.Недостатком является то, что он вызывает выделение кучи.
Статически, возвращая enum
:
enum KindOrLocation {
Kind(Kind),
Location(Location),
}
, чтобы сделать это пригодным для использованиякак Component
, вы можете реализовать Deref<Target = dyn Component>
:
impl Deref for KindOrLocation {
type Target = dyn Component + 'static;
fn deref(&self) -> &Self::Target {
match self {
KindOrLocation::Kind(x) => x,
KindOrLocation::Location(x) => x,
}
}
}
Недостатком здесь является то, что вы должны написать этот шаблонный код.
Кстати:
- Если вы определяете структуру с помощью
{}
, как struct Kind {}
, вы создаете ее объект, записывая Kind{}
, а не просто Kind
. - . Вам нужно обработать
_
дело в вашем матче: _ => panic!()
или что-то еще. - Не берите
&String
, а вместо этого &str
.Тогда это работает для и &String
и &str
.