Types 幻影数据和可变引用给出了一个;“活得不够长”;错误
我试图创建一个类型,该类型通过网络发送和接收数据,并将字节序列化/反序列化为声明的类型。为此,我一直在使用Types 幻影数据和可变引用给出了一个;“活得不够长”;错误,types,reference,rust,Types,Reference,Rust,我试图创建一个类型,该类型通过网络发送和接收数据,并将字节序列化/反序列化为声明的类型。为此,我一直在使用PhantomData输入std。然而,我最近遇到了一个情况,我想让我的方法接受一个&mut self参数,而rustc不会编译它。在下面的代码中,当没有可变引用时,一切都可以工作,但是通过添加可变引用,我得到 我不想将vec的创建移动到测试之前。将test想象为进程开始时绑定的套接字,将vec想象为正在传递的一些临时数据。 任何见解都将不胜感激 编辑: 我想知道为什么这适用于&self,而
PhantomData
输入std
。然而,我最近遇到了一个情况,我想让我的方法接受一个&mut self
参数,而rustc不会编译它。在下面的代码中,当没有可变引用时,一切都可以工作,但是通过添加可变引用,我得到
我不想将vec
的创建移动到测试之前。将test
想象为进程开始时绑定的套接字,将vec
想象为正在传递的一些临时数据。
任何见解都将不胜感激
编辑:
我想知道为什么这适用于&self
,而不适用于&mut self
。我希望确切地了解这里发生了什么,以便我能够决定我的下一步应该是什么。让这段特定的代码正常工作是很好的,但这是对rustc
编译器思想的信息性解释的第二步。这是正确的代码:
fn main() {
let vec = vec![1u8];
let mut test = Test {
data: PhantomData,
};
let slice = &vec[..];
let _res = test.test(&slice);
}
我首先移动了vec
创建。
然后test
变量必须是可变的,因为test
方法需要这样做
在评论后编辑
代码的问题在于,当您第一次调用Test
方法时,会推断出Test
类型中使用的泛型类型T
。在这种情况下,该类型是具有自己生存期的切片。事实上,一片面包是借来的,所以它也有它自己的寿命。
在您的示例中,生存期比测试变量生存期短,因此存在问题
一种可能的解决方案是使用Vec
作为类型,如下所示:
let mut test = Test {
data: PhantomData,
};
let vec = vec![1u8];
let _res = test.test(&vec);
&vec[…]
现在应该像&vec
那样编写。是的,这将使此代码正常工作,但我不想在创建测试结构之前创建vec。我应该更明确地说明这一点。假设Test
结构是在流程开始时创建的套接字,vec
是通过它传递的临时数据。@crhino我添加了另一个解决方案。如果我使用vec
,这是可行的,但我也想支持和[u8]
的使用。我仍然不确定为什么切片需要比test
变量更长的生命周期。我的理解是,切片只需比调用test.test(&slice)
的时间长。不管怎样,这就是我试图实现的目标。@crhino问题在于推断的测试类型将切片类型与其生存期一起获取为T。这是因为切片是借来的。你可以在这里找到更多信息:啊,我现在明白了。谢谢你对我有耐心!
let mut test = Test {
data: PhantomData,
};
let vec = vec![1u8];
let _res = test.test(&vec);