Я немного смущен тем, как работают указатели в 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-й тип указателя и убедиться, что мое понимание других типов верное? Я также хотел бы, чтобы кто-нибудь указывал на случаи общего использования, о которых я не упоминал.