Как вернуть переменную let в функцию, допустимую в rust? - PullRequest
0 голосов
/ 20 июня 2019

В этом примере компилирует и возвращает «ожидаемый» вывод.Но разве это не сценарий с висящим указателем?Если так, то почему же компилятор ржавчины позволяет это?

use serde_json::{Value, json};
use std::io::Result;

fn main(){
    println!("{:#?}", test_json_lifetime());
}

fn test_json_lifetime() -> Result<(Value)> {                            
    let j = json!({ "name" : "test" }); 
    Ok(j)
}

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Похоже, вы думаете, что j выделяется в кадре стека test_json_lifetime() (эта память освобождается в конце функции, когда стек разворачивается), и мы возвращаем ссылку на j ( что приведет к висячему указателю).

В этом случае вы правы, что j выделяется в стеке, однако, когда мы возвращаем Ok(j), мы не возвращаем ссылку на j, скорее мы копируем j в пространство для Result<(Value)>, который был выделен в кадре стека main() до вызова функции test_json_lifetime().

0 голосов
/ 20 июня 2019

Я нашел ответ в этом разделе .

fn main() {
let s1 = gives_ownership();         // gives_ownership moves its return
                                    // value into s1

let s2 = String::from("hello");     // s2 comes into scope

let s3 = takes_and_gives_back(s2);  // s2 is moved into
                                    // takes_and_gives_back, which also
                                    // moves its return value into s3
} 

// Here, s3 goes out of scope and is dropped. s2 goes out of scope but was
// moved, so nothing happens. s1 goes out of scope and is dropped.

fn gives_ownership() -> String {             // gives_ownership will move its
                                             // return value into the function
                                             // that calls it

    let some_string = String::from("hello"); // some_string comes into scope

    some_string                              // some_string is returned and
                                             // moves out to the calling
                                             // function
}
...