我正在尝试创建一种通过网络发送和接收数据并将字节序列化/反序列化为声明类型的类型。为此,我一直在PhantomData
中使用std
类型。但是,我最近出现了一种情况,我想让我的方法采用&mut self
参数,而rustc不会编译它。在下面的代码中,当没有可变引用时,一切都有效,但通过添加可变引用,我得到<anon>:24:18: 24:21 error: vec does not live long enough
。
我也尝试使用PhantomData<*const T>
类型,以免暗示所有权,但这并不奏效。从结构中删除PhantomData确实允许代码编译。
use std::io;
use std::marker::PhantomData;
struct Test<T> {
data: PhantomData<T>,
}
impl<T> Test<T> {
fn test(&mut self, _t: &T) -> Result<(), io::Error> {
Ok(())
}
}
//impl<T> Test<T> {
// fn test(&self, _t: &T) -> Result<(), io::Error> {
// Ok(())
// }
//}
fn main() {
let test = Test {
data: PhantomData,
};
let vec = vec![1u8];
let slice = &vec[..];
let _res = test.test(&slice);
}
http://www.perforce.com/perforce/doc.current/manuals/cmdref/P4IGNORE.html
我不想在vec
之前移动test
的创建。想象test
作为在进程开始时绑定的套接字,并vec
作为通过它的一些临时数据。
任何见解都会非常感激!
修改
我想知道为什么这适用于&self
而不适用于&mut self
。我希望了解到底发生了什么,以便我可以决定下一步应该是什么。让这个特定的代码工作是很好的,但是对rustc
编译器正在思考的内容的信息性解释是次要的。
答案 0 :(得分:2)
这是更正后的代码:
fn main() {
let vec = vec![1u8];
let mut test = Test {
data: PhantomData,
};
let slice = &vec[..];
let _res = test.test(&slice);
}
我首先移动了vec
创作。
然后test
变量必须是可变的,因为test
方法需要这样。
在评论后修改
您的代码存在的问题是,当您第一次调用T
方法时,会推断Test
类型中使用的泛型类型test
。在这种情况下,该类型是具有其自己的生命周期的切片。实际上,切片是借用的,因此它也有自己的生命周期。
在您的示例中,生命周期短于test
变量生命周期,因此您遇到了问题。
一种可能的解决方案是以这种方式使用Vec
:
let mut test = Test {
data: PhantomData,
};
let vec = vec![1u8];
let _res = test.test(&vec);