我正在学习Rust的生命周期/所有权概念,并想要解释一下在Rust中(rustc 1.37.0)的以下行为。
对于这样的程序:
#[derive(Debug)]
struct Book {
price: i32,
}
fn main() {
let book1 = Book {price: 12};
let cheaper_book = choose_cheaper(&book1);
println!("{:?}", cheaper_book);
}
fn choose_cheaper(b1: &Book) -> &Book {
if b1.price < 15 {
b1
} else {
let cheapest_book = Book {price: 0};
&cheapest_book
}
}
Rust报告:
17 | &cheapest_book
| ^^^^^^^^^^^^^^ returns a reference to data owned by the current function
我能理解这个错误,它是因为变量cheapest_book
拥有价格为0的书籍,而且在函数结束时会被删除,所以返回的引用将在此之后失效。但是如果我将choose_cheaper
函数更改为以下内容,很难解释为什么以下内容是允许的:
fn choose_cheaper(b1: &Book) -> &Book {
if b1.price < 15 {
b1
} else {
let cheapest_book = &Book {price: 0};
cheapest_book
}
}
能有人为我解释一下吗?谢谢。