gpt4 book ai didi

types - PhantomData 和可变引用给出 "does not live long enough"错误

转载 作者:行者123 更新时间:2023-11-29 08:27:41 26 4
gpt4 key购买 nike

我正在尝试创建一种类型,它通过网络发送和接收数据并将字节序列化/反序列化为声明的类型。为此,我一直在使用 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://is.gd/okj55K

我不想移动 vec 的创建在 test 之前.想象test作为在进程开始时绑定(bind)的套接字和 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时间。在这种情况下,该类型是一个有自己生命周期的切片。事实上,切片是借用的,所以它也有自己的生命周期。在您的示例中,生命周期短于 test 变量生命周期,因此您遇到了问题。

一个可能的解决方案是使用 Vec 作为类型:

let mut test = Test {
data: PhantomData,
};
let vec = vec![1u8];
let _res = test.test(&vec);

关于types - PhantomData 和可变引用给出 "does not live long enough"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32416302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com