什么生锈的生命周期实际上意味着什么?

  发布于 2023-01-19 21:39

所以,在:

fn v1<'a> (a:~[&'a str]) -> ~[&'a str] {
  return a;
}

#[test]
fn test_can_create_struct() {
  let x = v1("Hello World".split(' ').collect());
}

我知道,我已经阅读了http://static.rust-lang.org/doc/master/guide-lifetimes.html#named-lifetimes,但我不明白这段代码实际上做了什么.

该函数基本上是参数化的,如通用fn,但有一生,是我在IRC频道上看到的,但让我们想象就是这样,我们有一个L,这是一些特定的生命周期结构.

显然我隐含地称:

v1::("Hello World".split(' ').collect());

..但我不是.传递给这个函数的生命周期是一个生命周期的实例,它不是生命周期的类型,因此注释对我没有任何意义.

我的意思是,我基本上理解发生了什么(我认为):返回~[&str]的生命周期与调用者的范围相同,可能是test_can_create_struct()函数.那是因为(据我所知),函数v1是使用来自调用函数的生命周期实例调用的.

很混乱.

然后我们有一些其他的例子:https: //gist.github.com/bvssvni/8970459

这是一个片段:

impl<'a> Data<'a> {
  pub fn new() -> Data<'a> {
    Data { a: None, b: None }
  }

  pub fn a(&'a mut self, a: int) -> State<'a, Step1> {
    self.a = Some(a);
    State { data: self }
  }
}

现在我在这里天真地假设这Data<'a>意味着函数的生命周期实例a()是相同的.

即如果创建Data(let blah = Data::new())和调用blah.a(),则生命周期从create调用继承; 即State,只要父Data对象返回,返回的对象就会存在.

......但显然这也是错的.所以我现在根本不知道生命变量的含义.

救命!

1 个回答
  • 因此,回答这个问题的最简单方法就是退后一步,带您了解一生的实际情况.

    让我们来看一个简单的功能:

    fn simple_function() {
      let a = MyFoo::new();
      println("{}", a);
    }
    

    在这个函数中,我们有一个变量a.与所有变量一样,这个变量会存在一段时间.在这种情况下,它一直存在于函数的末尾.当功能结束时,a死亡.然后,生命周期a可以描述为从函数的开头开始,结束在函数的结尾.

    下一个函数将无法编译:

    fn broken_function() -> &MyFoo {
      let a = MyFoo::new();
      return &a;
    }
    

    当你这样做&a,你是借用一个参考a.然而,关于借贷的事情是,你应该把你借来的东西给回来.Rust对此非常严格,并且不会让您拥有无法返回的引用.如果您借用的参考资料不再存在,那么您无法返回参考资料,而这只是没有参考.

    它对我们意味着什么broken_function,因为a在函数结束时死亡,引用无法逃避函数,因为这将使它更耐用a.

    下一步是这样的:

    fn call_fn() {
      let a = MyFoo:new();
      {
        let a_ref = &a;
        let b = lifetimed(a_ref);
    
        println!("{}", *b);
      }
    }
    
    fn lifetimed<'a>(foo: &'a MyFoo) -> &'a MyBar {
       return foo.as_bar();
    }
    

    这里有两个功能,call_fn而且lifetimed这里有一些微妙的东西,所以我会分解它.

    call_fn我首先创建一个新实例MyFoo并将其分配给a,然后,我借用一个引用a并将其分配给a_ref.借用的东西是,当你进行借用时,生命周期信息会从你借来的变量转移到引用本身.所以现在a_ref,作为一个变量,它有自己的生命周期,它在内部范围的开始和结束处开始和结束,但是类型a_ref 有一个生命周期,一个转移过来的生命周期a.

    具体的生命周期不能命名,但我们假设我们可以通过使用数字来完成它.如果的寿命a#1,则该类型a_ref&'#1 MyFoo.当我们传递a_reflifetimed,编译器填充生命周期参数,'a就像它对其他类型参数一样.lifetimed返回类型是具有相同生命周期的引用,因此编译器填充那里的空间.有效地拨打电话lifetimed(foo: &'#1 MyFoo) -> &'#1 MyBar.

    这就是为什么生命周期出现在类型参数列表中,它们是类型系统的一部分,如果类型不匹配,那就是错误.编译器计算出函数编译所需的生命周期,因此您不必担心它,但不会在当前函数之外查看以获取更多信息.您需要使用参数告诉编译器您正在调用的函数,以便它知道一切正常.


    注意:您可以明确指定一个生命周期.'static这是整个程序持续时间的生命周期.

    2023-01-19 21:43 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有