哪个对堆分配点的引用是正确的?

fai*_*rjm 2 rust

在阅读本书之前,对堆的引用就像:

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;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

(来自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);
}
Run Code Online (Sandbox Code Playgroud)

(代码无法运行,因为它在移动后使用引用)
在此处输入图片说明
emmmm,r只是指向堆栈中的地址。是的,这是一个真正的引用,但rust中的引用是指针(对吗?)。
该图像与上面的图像相同(如果该值是堆栈分配的),并且更自然地解释了为什么移动后无法使用借位。

那么,哪个是科伦特呢?

Fra*_*gné 5

他们俩都以自己的方式是正确的。

Vec<T>可以借用无论是作为一个&Vec<T>或一个&[T]。同样,String可以将a借为a &String或as &strDeref当期望第二个时,Rust会自动(通过)强制第一个到第二个。

在第一个代码示例中,sv将其显式声明为切片。&v最初产生一个&Vec<f64>,但此引用隐式强制为片,以便可以将其分配给sv

但是,在第二个代码示例中,r未指定类型。因此Rust会推断其类型为&String,因为除非有必要,否则强制不会发生。

A &Vec<T>和A &String都看起来像第二张图片。指代a 或两者内部的A &[T]和a 看起来像第一张图片。&strVec<T>String