Я пробую случайные вещи, чтобы углубить свое понимание ржавчины. Я просто столкнулся с следующей ошибкой с этим кодом:
struct Person {
mother: Option<Person>,
father: Option<Person>,
partner: Option<Person>,
}
pub fn main() {
let susan = Person {
mother: None,
father: None,
partner: None,
};
let john = Person {
mother: None,
father: None,
partner: Some(susan),
};
}
error[E0072]: recursive type 'Person' has infinite size
--> src/main.rs:1:1
|
1 | struct Person {
| ^^^^^^^^^^^^^ recursive type has infinite size
2 | mother: Option<Person>,
| ---------------------- recursive without indirection
3 | father: Option<Person>,
| ---------------------- recursive without indirection
4 | partner: Option<Person>,
| ----------------------- recursive without indirection
|
= help: insert indirection (e.g., a 'Box', 'Rc', or '&') at some point to make 'Person' representable
Я понимаю, что могу исправить это, если я поставлю Person
in a Box
, так что это работает:
struct Person {
mother: Option<Box<Person>>,
father: Option<Box<Person>>,
partner: Option<Box<Person>>,
}
pub fn main() {
let susan = Person {
mother: None,
father: None,
partner: None,
};
let john = Person {
mother: None,
father: None,
partner: Some(Box::new(susan)),
};
}
Я хотел бы понять всю историю этого. Я знаю, что бокс означает, что он будет храниться в куче, а не в стеке, но я не понимаю, почему это направление необходимо.