我想創建一個通過網絡發送和接收數據並將字節序列化/反序列化爲聲明類型的類型。爲此,我一直在std
中使用PhantomData
類型。但是,最近我遇到了一種情況,我想讓我的方法採用&mut self
參數,而rustc不會編譯它。在下面的代碼中,當沒有可變引用時,所有東西都可以工作,但通過添加可變引用我得到<anon>:24:18: 24:21 error: vec does not live long enough
。PhantomData和可變引用給出了一個「不夠長」的錯誤
我也嘗試使用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);
}
我不想test
之前移動vec
的創建。假設test
是一個在進程開始時綁定的套接字,並且vec
是一些正在傳遞的臨時數據。 任何有識之士將不勝感激!
編輯: 我想知道爲什麼這個工程與&self
,而不是與&mut self
。我正在尋找理解到底發生了什麼,以便我可以決定我的下一步應該是什麼。獲得這個特定代碼的工作是很棒的,但是對於rustc
編譯器的想法的信息性解釋僅次於此。
'&VEC [..]'應寫爲只是'&時下vec'。 – Veedrac