You could instead do:
impl Classes {
pub fn get_a(&self) -> Option<&A> {
match self {
Classes::A(o) => Some(o),
_ => None,
}
}
}
fn main() -> Result<(), String> {
let obj: Rc<RefCell<Classes>> = Rc::new(RefCell::new(Classes::A(A::default())));
let a = obj.borrow().get_a().ok_or("not A".to_string())?;
Ok(())
}