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

标签 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;

enter image description here

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

(代码无法运行,因为它在移动后使用引用)
enter image description here
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/

相关文章:

rust - 是否可以将参数传递给Rust结构的默认值?

rust - 如何处理标有木马的木箱?

rust - 具有父类(super class)型生命周期的引用不能用于子类型生命周期

rust - 如何处理 RUST 中 Unresolved 导入 'concrete' 问题

rust - 如何将大 Vec<i32> 切片为 &[u8]?

rust - 参数类型可能不够长

rust - 序列化时跳过结构字段

syntax - 从引用分配变量时,ref 和 & 有什么区别?

generics - 如何在结构中存储闭包对象?

rust - 如何对余额编号进行算术运算以避免在NEAR智能合约中溢出?