当前位置: 首页 > 知识库问答 >
问题:

了解生命周期:最大生命周期和“静态”

蒋嘉实
2023-03-14

我对铁锈寿命的学习过程如下(基于铁锈书):

  1. 我想注释,当引用后面的值超出范围时
  2. 通常(并不总是!请参阅. data部分,即'静态')值位于{}
  3. 我们注释像't:{...}这样的块,例如结构字段像一样获得生命周期

在这一点上,我认为我的理解非常接近它的实际工作原理。但是现在,我的理解出错了。让我们看一些例子:

#[derive(Debug)]
struct Stats {
  league: &str,
}

const NAME: &str = "rust";

fn more_difficult_league(s1: &Stats, s2: &Stats) -> &str {
  if s1.league == s2.league {
    s1.league
  } else if s1.league == "PHP" {
    s2.league
  } else {
    "C++"
  }
}


fn main() {
  let mut st = Stats { league: name };
  let dleague = more_difficult_league(&st, &st);
  println!("{}", dleague);
}

显然,我省略了任何寿命规范。

>

  • 结构字段的生命周期要么是程序的整个持续时间('静态),要么是结构(Stats

    在函数/方法中,我们可能会获得生命周期为a、b、c的引用…。返回值的生存期是多少?

    • 要么是某个静态值('static
    • 要么始终是相同的特定生存期(如c)
    • 要么是一个特定的生命周期,在编译时或运行时都会知道这个生命周期。对于编译器,我们必须指定最坏情况下的生存期max('a,'b,'c,…)。据我所知,这可以通过给每一个引用相同的生命周期来实现

    这似乎适用于以下人为的、较短的函数:

    fn more_difficult_league<'a>(s1: &'a Stats, s2: &'a Stats) -> &'a str {
      if s1.league == s2.league {
        s1.league
      } else {
        s2.league
      }
    }
    

    如果我们添加一些静态返回值,最坏情况下的生存期是max('a',static),这可能是静态的:

    fn more_difficult_league<'a>(s1: &'a Stats, s2: &'a Stats) -> &'static str {
      if s1.league == s2.league {
        s1.league
      } else if s1.league == "PHP" {
        s2.league
      } else {
        "C++"
      }
    }
    

    这给出了错误[E0621]:s1类型中需要的显式生存期和s2类型中需要的静态生存期。联赛

    在哪一点上我的理解是错误的?提前感谢你对我的宽容。

    免责声明:help:为s1的类型添加显式生存期静态:


  • 共有1个答案

    麻书
    2023-03-14

    我会按照下面提供的方式更改您的代码。

    不要假装more_difficult_league()的结果具有静态生命周期(当我们引用s1s2时,编译器会抱怨这种情况),我们可以为此结果引入一个新的生命周期注释,并指定参数的生命周期必须超过此结果(在哪里子句)。

    #[derive(Debug)]
    struct Stats<'a> {
        league: &'a str,
    }
    
    const NAME: &str = "rust";
    
    fn more_difficult_league<'a, 'b, 'c>(
        s1: &'a Stats,
        s2: &'b Stats,
    ) -> &'c str
    where
        'a: 'c,
        'b: 'c,
    {
        if s1.league == s2.league {
            s1.league
        } else if s1.league == "PHP" {
            s2.league
        } else {
            "C++"
        }
    }
    
    fn main() {
        let st = Stats { league: NAME };
        let dleague = more_difficult_league(&st, &st);
        println!("{}", dleague);
    }
    
     类似资料:
    • 'static 生命周期在可能存在的生命周期中是最长的,并在运行程序的周期中持续存在。static 生命周期也可能被强制转换成一个更短的生命周期。有两种方式使变量拥有 static 生命周期,这两种方式都是保存在可执行文件的只读内存区: 使用 static 声明来产生常量(constant)。 产生一个拥有 &'static str 类型的 string 字面量。 看下面的例子,了解列举到的各个方

    • 注:本文档提供的生命周期指的是 Universal App 的生命周期,它依赖 rax-app 提供的 runApp方法。 App 级生命周期 launch  在 App 启动时触发 使用生命周期 你可以使用 rax-app 提供的 useAppLaunch 来注册 App 级别的生命周期。 示例: import { useAppLaunch } from 'rax-app'; useAppLa

    • 我们大致为WebAPplication设计了4个生命周期: 请求初始化其实就是从URL中解析提取出{module}, {action}, {method}; 然后再根据{module}, {action}, {method}找到对应的Controller文件; 然后再调用对应的{method},完了之后再发送响应。当然响应的过程中肯定是要顺带着解析下模板标签啦。 恩,这就完了,貌似感觉很简单啊。

    • 如下图. 可以看出,基本周期是: created mounted updated (update 可以理解成人肉手动操作触发) destroyed 上面步骤中的 1,3,4都是自动触发。 每个步骤都有对应的 beforeXyz方法 所以, 我们一般使用mounted 作为页面初始化时执行的方法

    • 概览 组件的生命周期分为三个阶段:挂载、渲染、卸载,下图展示了解组件在整个生命周期中所涉及到的方法调用、原型方法调用和状态变化。 挂载阶段 从组件实例被创建再到被插入根组件树中,所经历的操作如下: 初始化组件实例。 根据组件类型绑定对应的原型。 调用 proto->init() 原型方法。 标记组件需要刷新全部样式。 因父组件变为另外一个组件,触发 link 事件。 更新阶段 当组件被插入到根组件

    • 框架生命周期 Hyperf 是运行于 Swoole 之上的,想要理解透彻 Hyperf 的生命周期,那么理解 Swoole 的生命周期也至关重要。 Hyperf 的命令管理默认由 symfony/console 提供支持(如果您希望更换该组件您也可以通过改变 skeleton 的入口文件更换成您希望使用的组件),在执行 php bin/hyperf.php start 后,将由 Hyperf\Se