Как конвертировать черту в конкретный тип? - PullRequest
1 голос
/ 15 января 2020

У меня есть объект черты, и я хочу знать конкретный объект, на который он указывает, но я не могу понять, как получить конкретный объект.

Что я хочу, это что-то вроде следующего:

trait MyClonable {
   /** copy from another MyClonable */
   fn my_clone_from(&mut self, other: &Self)->Result<(), MyError>;
}

impl MyClonable for SomeType {
   fn my_clone_from(&mut self, other: &MyClonable)->Result<(), MyError> {...}
}

Так что я могу сказать что-то вроде:

let mut new_thing = SomeType::new();
new_thing.my_clone_from(&old_thing)?;

Тогда new_thing будет содержать своего рода копию old_thing, если old_thing не имеет неожиданный тип, в этом случае он должен вернуть ошибку.

Но Rust не позволит мне получить что-то вроде Option<&SomeType> от MyClonable.

1 Ответ

1 голос
/ 15 января 2020

Вы не можете. Объект черты только дает вам доступ к методам черты. Вам нужно было бы вручную указать, какой конкретный тип следует уменьшить, как описано в этом документе: Как получить ссылку на конкретный тип из объекта черты? .

Затем вы можете попробовать понижение до каждого из ваших известных типов, пока один из них не преуспеет, но это грязно.

Вместо этого лучше использовать дженерики:

trait MyClonable<T> {
    fn my_clone_from(&mut self, other: &T);
}

И теперь вы можете реализовать эту черту для все ваши поддерживаемые типы:

impl MyClonable<u32> for i32 {
    fn my_clone_from(&mut self, _other: &u32) { }
}

impl MyClonable<Tomato> for i32 {
    fn my_clone_from(&mut self, _other: &Tomato) { }
}
...