来自Rust文档:
Rust在函数体中支持强大的本地类型推断,但它故意不对项目签名的类型执行任何推理.然而,出于人体工程学的原因,在判断寿命时,确实应用了一种非常有限的二次推理算法,称为"终身省略".终身省略仅涉及使用三个易于记忆和明确的规则来推断寿命参数.这意味着终身省略作为编写项目签名的简写,而不是隐藏所涉及的实际类型,如果应用于完整的局部推断.
我不明白这意味着什么.什么是项目签名?"推断寿命参数"是什么意思?一些例子或类比会有所帮助.
Chr*_*son 17
项目签名是一个位,它给出了你的功能的名称和类型,即你需要调用它的一切(不需要知道它是如何实现的); 例如:
fn foo(x: u32) -> u32;
Run Code Online (Sandbox Code Playgroud)
这是另一个&str参考:
fn bar<'a>(s: &'a str) -> &'a str;
Run Code Online (Sandbox Code Playgroud)
在Rust中,所有引用都有附加的生命周期; 这是该类型的一部分.上面的bar函数说的不仅仅是"这个函数接受一个字符串的引用并返回另一个字符串".它说"这个函数接受一个字符串引用,并返回另一个函数,只要它给出的是有效的.这是Rust的所有权系统的一个重要部分.
然而,每次指定这些生命周期都很烦人并且很痛苦,所以Rust有"终身省略"(即"没有明确地写出来").所有这些意味着,对于一些非常常见的情况,您可以将生命周期注释保留,Rust将隐式地为您添加它们.这对程序员来说纯粹是一种方便,因此他们不必在"明显"的情况下写下这么多的生命周期.
规则列在书中,但为了完整性,它们是:
fn f(x: &T, y: &U)
Run Code Online (Sandbox Code Playgroud)
手段:
fn f<'a, 'b>(x: &'a T, y: &'b U)
Run Code Online (Sandbox Code Playgroud)
即这些生命之间没有自动联系.
struct U<'a> {} // struct with a lifetime parameter
fn f(x: &T) -> &U
Run Code Online (Sandbox Code Playgroud)
变为:
fn f<'a>(x: &'a T) -> &'a U<'a>
Run Code Online (Sandbox Code Playgroud)
&self或&mut self(即它是一个方法),那么所有省略的输出生命周期都与之相同self.这包括方法返回对其中一个字段的引用的常见情况.例如:impl S {
fn get_my_item(&self, key: &str) -> &str {}
}
Run Code Online (Sandbox Code Playgroud)
变为:
fn get_my_item<'a,'b>(&'a self, key: &'b str) -> &'a str // use the self lifetime
Run Code Online (Sandbox Code Playgroud)
该文档还有一些示例.
| 归档时间: |
|
| 查看次数: |
697 次 |
| 最近记录: |