簡體   English   中英

為什么這個閉包沒有比 var 長壽?

[英]Why doesn't this closure outlive var?

考慮以下 Rust 代碼:

use std::thread;

fn main() {
    bar();
    loop {}
}

fn bar() {
    let var = b"foo";
    thread::spawn(|| {
        write(var);
    });
}

fn write(d: &[u8]) {
    println!("{:?}", d)
}

據我了解, var在 function bar的堆棧上,它返回后不再存在。

盡管如此,新線程之后仍會訪問它並成功寫入數據。

  1. 為什么這行得通?
  2. 為什么 Rust 編譯器不報錯?

據我了解, var在 function bar的堆棧上,它返回后不再存在。

var只是類型&'static [u8; 3]的引用 &'static [u8; 3] 這個引用值是堆棧上的值,而不是字符串文字。

字節字符串文字b"foo"所有者程序 binary ,這導致字符串文字具有'static生命周期,因為它存在於正在運行的程序的整個生命周期中。

b"foo"值實際上並不存在於堆棧中。 它存儲在已編譯二進制文件的只讀 memory 中,並具有'static生命周期”。

考慮這個替代示例:

fn bar() {
    let var = format!("foo");
    thread::spawn(|| {
        write(&var);
    });
}

fn write(d: &str) {
    println!("{:?}", d)
}

這是行不通的(除非您在閉包之前添加move ),因為var (類型為String在堆棧上分配的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM