我对这两个看似相似的节目的结果感到惊讶。
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的设计让它表现得如此?提前致谢。
答案 0 :(得分:3)
我认为这是因为&
运算符在绑定或其他地方使用时的规则不同。
此:
let y: &int = &31i;
相当于:
let temp: int = 31i;
let y: &int = &temp;
除了temp
是不可见的。这可以解释为例如在lifetimes guide中,虽然本指南似乎是尚未重写的旧版本(与其他指南一样)。
但是这个:
let y: ∫
y = &31i;
由于某种原因没有这样的语义,因此31i
仅存在于其表达式内(即31i
)。因此,您无法参考它,因为它会立即被丢弃。
我认为这有点违反直觉,可能值得创造一个问题。也许这只是因为更重要的事情而被忽视的事情之一。