Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 地址范围:寿命不够长_Rust - Fatal编程技术网

Rust 地址范围:寿命不够长

Rust 地址范围:寿命不够长,rust,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

我对这两个明显相似的项目的结果感到惊讶

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的设计是如何让它这样的呢?提前谢谢

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

这:

相当于:

let temp: int = 31i;
let y: &int = &temp;
除了
temp
不可见之外。例如,在中对此进行了解释,但本指南似乎是较旧的版本,尚未重写(与其他指南一样)

但这是:

let y: ∫
y = &31i;
由于某种原因没有这样的语义,因此
31i
仅存在于其表达式中(即
31i
)。因此,您不能引用它,因为它会立即被丢弃


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

我记得在Niko的博客上读到一篇文章,他试图弄清临时工的一生应该是什么。似乎很难制定出一个既允许又有限制的详细规则(因为你希望借款范围严格……)。
let y: ∫
y = &31i;