PhantomData和可变引用给出了#34;活得不够长"错误

时间:2015-09-05 18:19:37

标签: types reference rust

我正在尝试创建一种通过网络发送和接收数据并将字节序列化/反序列化为声明类型的类型。为此,我一直在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编译器正在思考的内容的信息性解释是次要的。

1 个答案:

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