在我看书之前,对堆的引用是这样的:
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;
(来自 Programming 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 中的引用是指针(对吗?)。
如果值是堆栈分配的,则此图像与上图相同。并且更自然地解释了为什么不能在移动后稍后使用借用。
那么,哪个是正确的?
最佳答案
他们都以自己的方式正确。
A Vec<T>
可以作为 &Vec<T>
借用或作为 &[T]
.同样,一个 String
可以作为 &String
借用或作为 &str
.当预期第二个时,Rust 将自动强制(通过 Deref
)第一个到第二个。
在第一个代码示例中,sv
被显式声明为切片。 &v
最初产生一个 &Vec<f64>
, 但是这个引用被隐式地强制到一个切片,所以它可以分配给 sv
.
但是,在第二个代码示例中,r
的类型未指定。因此,Rust 将推断其类型为 &String
。 ,因为除非必要,否则不会发生强制转换。
A &Vec<T>
和一个 &String
两者看起来都像第二张照片。 &[T]
和一个 &str
指代 Vec<T>
的内部或 String
两者看起来都像第一张图片。
关于rust - 哪个对堆分配点的引用是正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58567517/