Я немного смущен тем, как работают указатели в Rust. Там ref, Box, &, *, и я не уверен, как они работают вместе.
Вот как я понимаю это в настоящее время:
-
Boxна самом деле не является указателем - это способ распределения данных в куче и пропускать в аргументах функции нестандартные типы (особенно черты). -
refиспользуется в сопоставлении с образцом, чтобы брать что-то, на что вы согласны, вместо того, чтобы принимать его. Например,let thing: Option<i32> = Some(4); match thing { None => println!("none!"), Some(ref x) => println!("{}", x), // x is a borrowed thing } println!("{}", x + 1); // wouldn't work without the ref since the block would have taken ownership of the data -
&используется для создания заимствования (заимствованного указателя). Если у меня есть функцияfn foo(&self), то я беру ссылку на себя, которая истечет после завершения функции, оставив данные вызывающего абонента в покое. Я также могу передать данные, которые я хочу сохранить, выполнивbar(&mydata). -
*используется для создания необработанного указателя: например,let y: i32 = 4; let x = &y as *const i32. Я понимаю указатели на C/С++, но я не уверен, как это работает с системой типа Rust и как их можно безопасно использовать. Я также не знаю, какие варианты использования для этого типа указателя. Кроме того, символ*может использоваться для разыменования вещей (что и почему?).
Может ли кто-нибудь объяснить мне 4-й тип указателя и убедиться, что мое понимание других типов верное? Я также хотел бы, чтобы кто-нибудь указывал на случаи общего использования, о которых я не упоминал.