哪个指向堆分配点的引用正确?

问题描述 投票:0回答:1

在阅读本书之前,对堆的引用类似于:

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;

enter image description here

(来自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);
}

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

所以,这是什么?

在阅读本书之前,对堆的引用类似于:让v:Vec = vec![0.0,0.707,1.0,0.707];让一个:[f64; 4] = [0.0,-0.707,-1.0,-0.707];让sv:&[f64] =&v; ...

rust
1个回答
0
投票

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

A Vec<T>可以作为&Vec<T>&[T]借用。同样,可以借用String作为&String&str。当期望第二个时,Rust会自动(通过Deref)将其强制转换为第二个。

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

© www.soinside.com 2019 - 2024. All rights reserved.