Доброго времени суток,
Программируя небольшую игрулечку на piston+rapier2d, создал класс героя(Hero) :
pub struct Hero {
pub rotation: f64,
pub health: f32,
pub texture: Texture,
step_size: f64,
// --- [ Physics ] --- //
body_handle: Option<RigidBodyHandle>,
rigid_body_set: Option<Rc<RefCell<RigidBodySet>>>,
collider_set: Option<Rc<RefCell<ColliderSet>>>,
}
Три последние члена класса задаются через функцию trait-a PhysicalObject - init_with_physics(…).
Вопрос у меня в том правильно ли я всё делаю, меня смущает синтаксическая «огромность» при доступе к этим трём членам класса. В частности, когда использую Option<Rc<RefCell<…>>>
Например что бы получить rigid_body_set :
let rigid_set_rc = self.rigid_body_set.clone().unwrap();
let mut rigid_set = rigid_set_rc.borrow_mut();
В одну строчку это сделать не получилось - rust-analyzer ругается :
temporary value dropped while borrowed consider using a
let
>binding to create a longer lived value
Также как понимаю при unwrap(), объект внутри option перемещается, поэтому приходится clone() использовать. Правильно ли это? Или есть другие подходы представлять в struct неинициализированные данные, которые могут быть позже заданы.