什么是一生简洁术语?

时间:2016-10-30 03:04:00

标签: rust lifetime

来自the Rust documentation

  

Rust在函数体中支持强大的本地类型推断,但它故意不对项目签名的类型执行任何推理。然而,出于人体工程学的原因,在判断寿命时,确实应用了一种非常有限的二次推理算法,称为“终身省略”。终身省略仅涉及使用三个易于记忆和明确的规则来推断寿命参数。这意味着终身省略作为编写项目签名的简写,同时不会隐藏所涉及的实际类型,如果应用于完整的局部推理。

我不明白这意味着什么。什么是项目签名? “推断寿命参数”是什么意思?一些例子或类比会有所帮助。

1 个答案:

答案 0 :(得分:16)

项目签名是一个位,它给出了你的功能的名称和类型,即你需要调用它的所有东西(不需要知道它是如何实现的);例如:

fn foo(x: u32) -> u32;

这是另一个需要&str引用的内容:

fn bar<'a>(s: &'a str) -> &'a str;

在Rust中,所有引用都有附加的生命周期;这是该类型的一部分。上面的bar函数说的不仅仅是&#34;这个函数接受一个字符串的引用并返回另一个&#34;。它说&#34;这个函数接受一个字符串引用,并返回另一个,它只有它给出的那个有效。这是Rust所有权系统的重要组成部分。

然而,每次指定这些生命周期都很烦人且很痛苦,所以Rust已经终生难忘了#34; (即&#34;没有明确地写出来&#34;)。所有这些意味着,对于一些非常常见的情况,您可以将生命周期注释保留,Rust将隐式地为您添加它们。对于程序员来说,这纯粹是一种方便,因此他们不必写出如此多的生命周期。例。

规则列在the book中,但为了完整性,它们是:

  1. 函数参数中未指定的每个生命周期都不同。例如:
  2. fn f(x: &T, y: &U)
    

    表示:

    fn f<'a, 'b>(x: &'a T, y: &'b U)
    

    即。这些生命之间没有自动联系。

    1. 如果只有一个输入生命周期,则它用于每个输出生命周期。例如:
    2. struct U<'a> {}  // struct with a lifetime parameter
      
      fn f(x: &T) -> &U
      

      变为:

      fn f<'a>(x: &'a T) -> &'a U<'a>
      
      1. 否则,如果有多个输入生命周期,但其中一个是&self&mut self(即它是一个方法),那么所有省略的输出生命周期都与{{1 }}。这包括方法返回对其中一个字段的引用的常见情况。例如:
      2. self

        变为:

        impl S {
            fn get_my_item(&self, key: &str) -> &str {}
        }
        

        文档中有更多示例。