为啥这两个结构在受生命周期影响的方式上有所不同

Posted

技术标签:

【中文标题】为啥这两个结构在受生命周期影响的方式上有所不同【英文标题】:Why do these both structs differ in the way they are affected by lifetimes为什么这两个结构在受生命周期影响的方式上有所不同 【发布时间】:2014-08-09 04:17:26 【问题描述】:

这是一个后续问题:How to fix: cannot infer an appropriate lifetime for automatic coercion。

我想知道为什么这两个结构在受生命周期影响的方式上有所不同。

示例 1

use http;

pub struct Request<'a> 
    pub origin: &'a http::server::Request,

示例 2

use http;

pub struct Response<'a, 'b> 
    pub origin: &'a mut http::server::ResponseWriter<'b>,

它们看起来和我非常相似,除了第二个持有可变引用而第一个持有不可变引用。

但是,对于示例 2,我不能只使用生命周期作为参考。我也必须为该结构提供生命周期。

所以,我想知道导致这种行为的结构 inside 是否真的是因为第二个示例中的那个是可变引用。如果是这样,为什么会导致这种情况。

【问题讨论】:

"但是,对于示例 2,我不能只为引用使用生命周期。我也必须为结构提供生命周期。"你的意思是ResponseWriter后面不能省略&lt;'b&gt;?在这种情况下,这是因为 ResponseWriter 是由生命周期参数化的,而 Request 不是。这类似于您必须编写带有参数的Option&lt;int&gt; 但不带参数的String 如果你检查ResponseWriter的定义,你会发现它包含一个引用。我猜是这个 ResponseWriter:rust-ci.org/chris-morgan/rust-http/doc/http/server/response/… 啊,太棒了。它在其定义中由生命周期参数化。所以我必须考虑到这一点。说得通!如果有人愿意将其添加为答案,我将很乐意接受:) How to fix: cannot infer an appropriate lifetime for automatic coercion的可能重复 (作为一般规则,如果您有一点额外的问题——这只是要求澄清——最好将其保留在同一个问题中。) 【参考方案1】:

&amp;'a T 表示您引用了一个在生命周期内有效的T 对象'a

T&lt;'b&gt; 表示一个 T 对象,其内部包含一个在 'b 的生命周期内有效的对象,如 struct T&lt;'b&gt; t: &amp;'b U

&amp;'a T&lt;'b&gt;因此是一个生命周期'aT&lt;'b&gt;对象的引用。

对于ResponseWriter,它包含对RequestTcpStream 的引用,而Request 不包含任何引用。

【讨论】:

以上是关于为啥这两个结构在受生命周期影响的方式上有所不同的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能在结构定义中省略生命周期?

为啥作为参数传递的特征对象的生命周期需要更高等级的特征边界,而结构不需要?

与 Vec 相比,为啥 SmallVec 在存储具有生命周期的类型时会有不同的行为?

react生命周期,以及各个周期都做了啥

深入剖析Android四大组件——Activity生命周期具体解释

为啥 Rust 编译器要求我限制泛型类型参数的生命周期(错误 E0309)?