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

Rust 什么时候静态生命周期不合适?,rust,lifetime,borrow-checker,Rust,Lifetime,Borrow Checker,我在网上找到了很多关于生锈寿命的信息,包括关于静态寿命的信息。对我来说,在某些情况下,您必须保证引用将比一切都有效 例如,我有一个要传递给线程的引用,编译器请求将该引用标记为静态引用。在这种情况下,这似乎是有意义的,因为编译器不知道线程将生存多长时间,因此需要确保传递的引用比线程的寿命长。(我认为这是正确的?) 我不知道这是从哪里来的,但我总是担心用静态生命周期标记某个东西是值得怀疑的,并且在可能的情况下避免 所以我想知道这是否正确。我应该批评用静态生命周期标记事物吗?是否存在编译器需要一种策略

我在网上找到了很多关于生锈寿命的信息,包括关于静态寿命的信息。对我来说,在某些情况下,您必须保证引用将比一切都有效

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

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

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


关于静态生命周期的应用,我有哪些具体的方法可以进行推理,并可能确定它何时不合适?

正如您可能已经猜到的,没有明确的技术答案

作为生锈的新手,
静态的
引用似乎违背了借阅系统的全部目的,有一种避免它们的想法。一旦你有了更多的经验,这种想法就会消失

首先,
'static
看起来并不坏,因为所有没有其他生命周期的东西都是
'static
,例如
String::new()
。请注意,
'static
并不意味着所讨论的值确实永远存在。它只是意味着价值可以被创造为永远存在。在您的线程示例中,线程无法对自己的生命周期做出任何承诺,因此它需要能够使传递给它的所有事物永远存在。任何拥有的价值,如果不包括比
'static
(如
vec![1,2,3]
)短的生命周期,就可以使其永久存在(只需不破坏它们),并因此成为
'static

其次,
&'static
——静态引用——无论如何也不会经常出现。如果有,你通常会知道原因。您不会看到太多的
fn-foo(bar:&'static bar)
,因为它没有太多的用例,而不是因为它被积极地避免了

有些情况下,
静态的
确实以令人惊讶的方式出现。在我脑海中:


  • Box
    是一个
    Box而不是
    &的静态T
    ,将
    传递给线程。这只需要很小的成本,并确保生命周期不会超过必要的时间。

    对于链接,它似乎表现出类似的不确定性。为了补充这个伟大的答案,我想提请大家注意
    静态T
    T:static
    之间的区别——初学者经常混淆这两者,但它们不是一回事。除了这个答案中的解释之外,它还被椒盐卷饼(一种常见的锈病)的《锈病终生误解》一文深入地涵盖了。