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);