在阅读本书之前,对堆的引用类似于:
let v: Vec<f64> = vec![0.0, 0.707, 1.0, 0.707];
let a: [f64; 4] = [0.0, -0.707, -1.0, -0.707];
let sv: &[f64] = &v;
let sa: &[f64] = &a;
(来自Rust编程)sv是对堆的引用,因此它指向堆中与v相同的地址。
但是我读了https://www.net.in.tum.de/fileadmin/bibtex/publications/theses/2018-ixy-rust.pdf中的一篇文章。
fn main(){ let s = String ::from("hello"); let r = &s; let t = s; println!("{}", r); }
(该代码无法运行,因为它在移动后使用了引用)emmmm,r只是指向堆栈中的地址。是的,这是一个真正的引用,但rust中的引用是指针(对吗?)。该图像与上面的图像相同(如果该值是堆栈分配的),并且更自然地解释了为什么移动后无法使用借位。
所以,这是什么?
在阅读本书之前,对堆的引用类似于:让v:Vec
他们俩都以自己的方式是正确的。
A Vec<T>
可以作为&Vec<T>
或&[T]
借用。同样,可以借用String
作为&String
或&str
。当期望第二个时,Rust会自动(通过Deref
)将其强制转换为第二个。
在第一个代码示例中,Deref
被明确声明为切片。 sv
最初会产生&v
,但是此引用被隐式强制为片,以便可以将其分配给&Vec<f64>
。