Я столкнулся с проблемой, для которой, по моему мнению, идеально было бы использовать трейт-объекты. Хотя мне удалось заставить его работать, он выглядит намного сложнее, чем должен, поэтому я хотел бы знать, есть ли более оптимальный способ использования типовых объектов.
Пример кода:
/* This takes a slice of objects implementing trait and compares each of
them with all other objects in the slice, if they interact with each other
both objects should call a certain function with the other object as a parameter.
This is used for a collision system, in case you know of a better way to solve this please
let me know. */
fn foo(objects: &mut [Box<Trait>]) {
let mut active_objects: Vec<&mut Box<Trait>> = vec!();
for current in objects.iter_mut() {
for other in active_objects.iter_mut() {
if (**current).is_interacting(&***other) {
current.boo(&mut ***other);
other.boo(&mut **current);
}
}
active_objects.push(current);
}
}
trait Trait {
fn boo(&mut self, other: &mut Trait);
fn is_interacting(&self, other: & Trait) -> bool;
}
Есть ли способ, которым мне не нужно писать что-то вроде &*** каждый раз, когда я хочу использовать фактический объект?
if (**current).is_interacting(&***other) становится if current.is_interacting(&***other), так как Rust автоматически разыменовывает в этом случае.
current, это происходит автоматически. - person Boiethios   schedule 18.07.2017*на 8. - person lncr   schedule 18.07.2017other, потому что тип&mut &mut std::boxed::Box<Trait>. - person Boiethios   schedule 18.07.2017active_objectsдолжен быть вектором ссылок, так как в противном случае я бы вышел из заимствованного контекста, и я долженiter_mutиметь возможность видоизменять объект типажей, так что пока я согласен с тем, что&mut &mutэто что-то нежелательное, иначе я не знаю, как это сделать... - person lncr   schedule 18.07.2017