首页 文章

地址范围:活得不够长

提问于
浏览
2

我对这两个看似相似的程序的结果感到惊讶 .

fn main() {
    let y: &int = &31i;
    println!("My number is {}.",*y)
}
//Output
My number is 31.

但是,这段代码给了我一个错误 .

fn main() {
    let y: ∫
    y = &31i;
    println!("My number is {}.",*y)
}
// Output on Rust Playpen
3:12 error: borrowed value does not live long enough
5:2 note: reference must be valid for the block at 1:10...
3:13 note: ...but borrowed value is only valid for the statement at 3:4

显然, &31i 超出范围,如果在声明 y 之后将其分配给 y . 但是,如果它位于声明 y 的同一行,则它将保留在范围内 . 我不明白为什么会这样 .

Rust的设计如何使其表现如此?提前致谢 .

1 回答

  • 3

    我认为这是因为 & 运算符在绑定或其他地方使用时的规则不同 .

    这个:

    let y: &int = &31i;
    

    相当于:

    let temp: int = 31i;
    let y: &int = &temp;
    

    除了 temp 是不可见的 . 这可以解释为例如在lifetimes guide中,虽然本指南似乎是尚未重写的旧版本(与其他指南一样) .

    但是这个:

    let y: ∫
    y = &31i;
    

    由于某种原因没有这样的语义,所以 31i 只存在于其表达式中(即 31i ) . 因此,您无法参考它,因为它会立即被丢弃 .

    我认为这有点违反直觉,可能值得创造一个问题 . 也许这只是因为更重要的事情而被忽视的事情之一 .

相关问题