地址范围:活得不够长

时间:2014-11-20 20:43:35

标签: rust

我对这两个看似相似的节目的结果感到惊讶。

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 个答案:

答案 0 :(得分:3)

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

此:

let y: &int = &31i;

相当于:

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

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

但是这个:

let y: ∫
y = &31i;

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

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