Struct 为什么在Rust中允许返回当前函数拥有的引用?

Struct 为什么在Rust中允许返回当前函数拥有的引用?,struct,rust,initialization,lifetime,ownership,Struct,Rust,Initialization,Lifetime,Ownership,我正在学习Rust的寿命/所有权概念,并想解释Rust(rustc 1.37.0)中的以下行为 对于这样的程序: #[派生(调试)] 结构书{ 价格:i32, } fn main(){ let book1=Book{price:12}; 让更便宜的书=选择更便宜的书(&book1); println!(“{:?}”,更便宜的书); } fn选择更便宜的(b1:&Book)->&Book{ 如果b1.1价格&Book{ 如果b1.1价格 rust是否会进行此转换的规则是每当您在&后面“构造”对象时

我正在学习Rust的寿命/所有权概念,并想解释Rust(rustc 1.37.0)中的以下行为

对于这样的程序:

#[派生(调试)]
结构书{
价格:i32,
}
fn main(){
let book1=Book{price:12};
让更便宜的书=选择更便宜的书(&book1);
println!(“{:?}”,更便宜的书);
}
fn选择更便宜的(b1:&Book)->&Book{
如果b1.1价格<15{
b1
}否则{
让最便宜的书=书{价格:0};
&最便宜的书
}
}
锈蚀报告:

17 |   &cheapest_book
   |   ^^^^^^^^^^^^^^ returns a reference to data owned by the current function
我可以理解这个错误,这是因为变量
cheapest_book
是价格为0的书的所有者,它将在函数结束时被删除,因此返回的引用将在此之后无效。但是,如果我将
choose\u leaver
函数更改为以下内容,我很难解释为什么允许:

fn选择更便宜的(b1:&Book)->&Book{
如果b1.1价格<15{
b1
}否则{
让最便宜的书=&book{price:0};
最便宜的书
}
}

有人能给我解释一下吗?谢谢。

行中让最便宜的书=&book{price:0}
,则
书籍
不是
书籍
类型的“新”实例。每次调用此函数时,它都将返回对
Book
类型的同一实例的引用,该引用将存储在可执行文件的只读数据部分(或者,从技术上讲,如果数据部分包含
单元格或
原子化
或类似内容,则存储在数据部分)

在本例中,我们可以将代码“扩展”为更加明确的内容:

static GLOBAL\u BOOK:BOOK=BOOK{price:0};
fn选择更便宜的书{
如果b1.1价格<15{
b1
}否则{
让最便宜的书=&GLOBAL\u book;
最便宜的书
}
}
请注意,对
GLOBAL\u BOOK
的引用实际上可能是
&'static BOOK
,但
&'a BOOK
是该引用的超类型,因此可以将静态引用作为
'a
引用返回

如果这看起来很奇怪,请考虑这就是字符串文字所发生的情况;它们只是没有显式的

&
字符:在
之后,让foo=“string!”
foo
是一个引用可执行文件只读部分中某些数据的
&'static str
,而不是本地对象。因此,您还可以编写
返回“string!”'a
返回
和'a str
的函数中的code>


rust是否会进行此转换的规则是每当您在
&
后面“构造”对象时(使用元组语法、结构或枚举或联合初始化语法、数字或字符串文本或其任何组合-函数调用
new()
或任何其他函数),它们将成为匿名静态文件。因此,实际上
&&1_u32
是对静态
'static
引用,是对静态
u32
的引用,可能是值得一提的重复:这种行为的术语是“静态提升”