什么时候静态生命周期不合适?

2023-12-23

我在网上找到了很多有关 Rust 生命周期的信息,包括有关静态生命周期的信息。对我来说,在某些情况下,你必须保证引用比所有东西都更长寿,这是有道理的。

例如,我有一个要传递给线程的引用,编译器要求将该引用标记为静态。在这种情况下,这似乎是有意义的,因为编译器无法知道线程的生存时间,因此需要确保传递的引用比线程的生存时间长。 (我认为这是正确的?)

我不知道这是从哪里来的,但我总是担心用静态生命周期标记某些东西是值得怀疑的,并尽可能避免。

所以我想知道这是否正确。我应该对用静态生命周期标记事物持批评态度吗?是否存在编译器想要需要一种策略,但替代策略实际上可能更优化的情况?

我可以通过哪些具体方法来推断静态生命周期的应用,并可能确定它何时不合适?


正如您可能已经猜到的那样,对此没有明确的技术答案。

作为 Rust 的新手,'static引用似乎违背了借用系统的全部目的,并且有一个想法可以避免它们。一旦你变得更有经验,这种想法就会消失。

首先,'static看起来并不坏,因为所有没有其他生命周期与之相关的事物都是'static, e.g. String::new()。请注意'static does not意味着所讨论的价值确实永远存在。这只是意味着价值可以制作永远活下去。在您的线程示例中,线程无法对其自己的生命周期做出任何承诺,因此它需要能够to make所有传递给它的东西都永远存在。任何拥有的价值,不包括短于'static (like vec![1,2,3]) 可以制作永远活下去(只是不摧毁它们),因此'static.

Second, &'static- 静态参考 - 无论如何不会经常出现。如果是这样,您通常会知道原因。你不会看到很多fn foo(bar: &'static Bar)因为它根本没有那么多用例,而不是因为它被积极避免。

有些情况'static确实以令人惊讶的方式出现。意料之外:

  • A Box<dyn Trait> is 隐含地 https://rust-lang.github.io/rfcs/1156-adjust-default-object-bounds.html a Box<dyn Trait + 'static>。这是因为当里面的值的类型Box被擦除,它可能有与之相关的生命周期;并且所有(不同的)类型都必须有效Box生活。因此,所有类型都需要在其生命周期中共享一个共同点,而 Rust 被定义为选择'static。这种选择通常是可以的,但可能会导致令人惊讶的“需要'静态”错误。您可以将其明确概括为Box<dyn Trait + 'a>
  • 如果你有定制impl Drop根据您的类型,Drop-checkermay https://doc.rust-lang.org/nomicon/dropck.html无法证明析构函数无法观察到已经被删除的值。为了防止Dropimpl 不访问对已删除值的引用,编译器要求整个类型仅具有'static里面有参考文献。这可以通过不安全的实现来克服,它会提升'static-要求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候静态生命周期不合适? 的相关文章

随机推荐

  • 将键码的字符串表示形式转换为 Qt::Key (或任何 int)并返回

    我想将代表键盘上的键的字符串转换为键码枚举 例如Qt Key http doc qt digia com 4 7 qt html Key enum 或其他任何东西 转换示例如下 Ctrl to Qt Key Control Up to Qt
  • 远程处理 - 有关客户端的信息。 C#

    在 net 2 0 上使用远程处理时是否可以找到 获取有关连接客户端的一些信息 我想知道有关服务器端连接客户端的一些信息 以便我可以采取相应的行动 这是一个小型且非常本地化的应用程序 同时连接 请求的客户端数量最多不会超过 10 个 在每个
  • Facebook 登录 JS - FB.Event.subscribe('auth.login') 无需点击登录按钮即可触发

    我真的需要您帮助我尝试在我的网站上实现 使用 Facebook 登录 功能 基本上 我正在努力实现以下目标 如果用户之前已确认该应用程序并单击 FB 登录按钮 在我的网站上 他们登录到该网站 使用网站的用户 与 Facebook 用户 ID
  • Jquery 如果它是第一次单击元素

    我需要我的脚本在第一次单击元素时执行某些操作 并在单击 2 3 4 等时继续执行不同的操作 selector click function I would realy like this variable to be updated var
  • 如何扩展/继承组件?

    我想为 Angular 2 中已经部署的一些组件创建扩展 而不必几乎完全重写它们 因为基础组件可能会发生更改 并希望这些更改也反映在其派生组件中 我创建了这个简单的示例来尝试更好地解释我的问题 具有以下基本组件app base panel
  • 了解 JNDI

    JNDI 就像是一张增强版的地图 对吧 我使用键来查找对象的引用 另外 什么是InitialContext 我似乎不太明白这个想法 从概念上讲 JNDI 就像System getProperties 使用类固醇 System getProp
  • Nexus 6 融合位置提供程序 getSpeed 返回 0

    运行 Android 5 0 1 的 Nexus 6 设备上安装的 Google Play 服务版本 6 7 76 设备设置 位置模式设置为 仅限设备 在 Nexus 6 上 当使用具有 PRIORITY HIGH ACCURACY 的融合
  • JDK7 SSL 连接问题忽略不支持的密码套件:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

    我正在建立 SSL 连接 作为客户端 并根据这篇 Oracle 文章 http docs oracle com javase 8 docs technotes guides security SunProviders html SunJSS
  • AWS ECS 503 服务在部署时暂时不可用

    我正在为我的应用程序使用 Amazon Web Services EC2 容器服务和应用程序负载均衡器 当我部署新版本时 我收到 503 服务暂时不可用大约 2 分钟 这比我的应用程序的启动时间要长一点 这意味着我现在无法进行零停机部署 是
  • 拉姆达捕获

    我总是对 lambda 捕获感到困惑 并且不知道变量是通过引用捕获还是通过值捕获 例如 如果我有 a 我不知道是否a通过值或引用捕获 我认为获得它的一个简单方法是通过示例 因此 让我们为每种情况准备一个 如果有多种表达同一事物的方式 则更多
  • 在 php 类中使用 html 是否不好?

    在类函数中使用 html 有什么问题吗 我在 DOM 中调用它 因此不需要返回字符串 public function the contact table gt div some html here div div class staff m
  • 在django中使用分页时如何返回最后一页?

    在一个简单的论坛中 我使用本机 django分页 https docs djangoproject com en 1 8 topics pagination 我希望用户在发布帖子后能够被引导至主题的最后一页 这是视图 login requi
  • Python:确保我的类仅使用最新协议进行腌制

    我正在开发一个只能使用协议 2 以及 Python 3 以上 进行有意义的腌制的类 当使用较旧的协议时 会发生难以追踪的错误 我希望为该类的用户节省一些调试的麻烦 因此我希望该类在使用小于 2 的协议进行 pickle 时立即引发异常 我怎
  • 存储序列化数组时进行清理

    如果我将序列化数组存储到 mysql 数据库 我应该在使用序列化函数之前或之后进行清理吗 或者我什至需要消毒吗 例如 details name mysql real escape string POST name details email
  • iOS 应用程序中的点赞按钮

    有谁知道如何将 Facebook 喜欢 按钮放入 iOS 应用程序中 我已经尝试过这里描述的方法博客文章 http petersteinberger com 2010 06 add facebook like button with fac
  • 使用 SQL 从 Oracle 数据库插入和检索 BLOB 数据的方法有哪些?

    我尝试使用 SQL Developer 插入 BLOB 数据 但我找不到实际用于插入 BLOB 数据的插入语句 除此之外 数据库速度确实很慢 对于小文件 它执行得很好 但是当我尝试将 50 mb avi 文件导入 BLOB 时 花了 3 4
  • Ruby Integer()、Array() 等——它们是什么?他们来自哪里?

    我有时遇到过 Array value String value 和 Integer value 形式的转换 在我看来 这些只是调用相应 value to a value to s 或 value to i 方法的语法糖 所以我想知道 这些是
  • Vuex如何处理api错误通知?

    两周前我开始使用 Vuex 我意识到 Vuex 非常适合处理应用程序的状态 但是 API调用的错误很难处理 当我从服务器获取数据时 我会调度一个操作 当数据成功返回后 当然一切都好了 但是当错误发生时 我改变了状态 我不知道如何通过Vuej
  • 通过 CSS 进行图像缩放:是否有 -moz-crisp-edges 的 webkit 替代品?

    我有一张像素为 100x100 的图像 我想显示它两倍的大小 所以 200x200 我想通过 CSS 来完成 而不是通过服务器来完成 几年以来 所有浏览器都对图像进行了抗锯齿处理 而不是按像素缩放 Mozilla 允许指定算法 image
  • 什么时候静态生命周期不合适?

    我在网上找到了很多有关 Rust 生命周期的信息 包括有关静态生命周期的信息 对我来说 在某些情况下 你必须保证引用比所有东西都更长寿 这是有道理的 例如 我有一个要传递给线程的引用 编译器要求将该引用标记为静态 在这种情况下 这似乎是有意