какая ссылка на выделенную кучу точку верна? - PullRequest
2 голосов
/ 26 октября 2019

Прежде чем я прочту книгу, ссылка на кучу выглядит так:

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
мммм, просто укажите адрес в стеке. Да, это действительно ссылка, но ссылка в ржавчине - это указатель (верно?).
Это изображение такое же, как и выше, если значение выделено в стеке. И это более естественно объяснить, почему нельзя использовать заем позже после перемещения,

Итак, что такое corrent?

1 Ответ

5 голосов
/ 26 октября 2019

Они оба верны по-своему.

A Vec<T> можно заимствовать либо как &Vec<T>, либо как &[T]. Аналогично, String может быть заимствовано либо как &String, либо как &str. Rust будет автоматически приводить (через Deref) первое ко второму, когда ожидается второе.

В первом примере кода sv явно объявлено как срез. &v изначально создает &Vec<f64>, но эта ссылка неявно приводится к срезу, так что его можно присвоить sv.

Однако во втором примере кода тип rне указаноТаким образом, Rust выведет его тип &String, потому что принуждения не происходят, если они не необходимы.

A &Vec<T> и &String оба выглядят как вторая картинка. A &[T] и &str, которые относятся к внутренней части Vec<T> или String, выглядят как первое изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...