Rust 幻影数据用例
我试图理解rust中的phantomData,我在一个原始指针周围有一个Foo结构,我告诉编译器Foo不能比'a寿命长,所以我试图防止在Foo之前删除属性v的值,但我发现它不起作用,因为字符串s可以在f之前删除。我误解了什么吗Rust 幻影数据用例,rust,Rust,我试图理解rust中的phantomData,我在一个原始指针周围有一个Foo结构,我告诉编译器Foo不能比'a寿命长,所以我试图防止在Foo之前删除属性v的值,但我发现它不起作用,因为字符串s可以在f之前删除。我误解了什么吗 struct Foo{//我说T在生命周期“a”中是有效的 第五酒吧:*mut T T, _mark:PhantomData从评论中,我认为混淆源于T:'a和生存期推断。问题是T的任何生存期参数都与'a一样长。对于T类型,如字符串,没有生存期参数,因此'a的任何值都是如此
struct Foo{//我说T在生命周期“a”中是有效的
第五酒吧:*mut T T,
_mark:PhantomData从评论中,我认为混淆源于T:'a
和生存期推断。问题是T
的任何生存期参数都与'a
一样长。对于T
类型,如字符串
,没有生存期参数,因此'a
的任何值都是如此g静态的
粗略地说,T:'a
意味着只要'a
,您就可以保留类型为T
的值。它必须拥有自己的数据(如字符串
),或者它包含的任何引用都必须足够长
因此,当您初始化f
时:
let f = Foo {
v: &mut s,
_mark: PhantomData,
};
T
可以推断为String
,但是'a
的任何值都是有效的。对生存期没有限制
必须以某种方式告诉编译器,初始化引用的生存期(在初始化Foo
之前,我们将其转换为无生存期指针)与我们要在Foo
上使用的生存期相连接。例如:
impl<'a, T: 'a> Foo<'a, T> {
// the input lifetime and the output lifetime are the same
fn new(t: &'a mut T) -> Foo<'a, T> {
Foo {
v: t,
_mark: PhantomData,
}
}
}
let f = Foo::new(&mut s);
impl-Foo-Foo从评论中,我假设混淆源于T:'a
和生存期推断。问题是T
的任何生存期参数都与'a
一样长。对于T
类型,如字符串
,没有生存期参数,因此'a
的任何值都是如此g静态的
粗略地说,T:'a
意味着只要'a
,您就可以保留类型为T
的值。它必须拥有自己的数据(如字符串
),或者它包含的任何引用都必须足够长
因此,当您初始化f
时:
let f = Foo {
v: &mut s,
_mark: PhantomData,
};
T
可以推断为String
,但是'a
的任何值都是有效的。对生存期没有限制
必须以某种方式告诉编译器,初始化引用的生存期(在初始化Foo
之前,我们将其转换为无生存期指针)与我们要在Foo
上使用的生存期相连接。例如:
impl<'a, T: 'a> Foo<'a, T> {
// the input lifetime and the output lifetime are the same
fn new(t: &'a mut T) -> Foo<'a, T> {
Foo {
v: t,
_mark: PhantomData,
}
}
}
let f = Foo::new(&mut s);
impl-Foo-FooThis基本上就是rustdoc中给出的例子。我很惊讶它不起作用并且允许“免费后使用”@SvetlinZarev是的,这让我很困惑,编译器怎么知道'a
在任何方面都与s
相关,因为您使用的语言功能明确地删除了任何此类关系hip?@trentcl谢谢,我试图理解rust doc中的示例,它说“这反过来也需要注释T:'a,表示T中的任何引用在生命周期'a'内都是有效的。”,所以我的理解是,我告诉Foo有一个泛型类型T和泛型生存期'a,在这个例子中,T是字符串,s的生存期是'a?这基本上就是rustdoc中给出的例子。我很惊讶它不起作用,并且允许“自由后使用”@SvetlinZarev是的,这让我困惑,编译器怎么知道呢'a
在任何方面都与s
相关,因为您使用的语言功能明确删除了任何此类关系?@trentcl谢谢,我试图理解rust doc中的示例,它说“这反过来也需要注释T:'a,表示T中的任何引用在生命周期'a'内都是有效的。”,所以我的理解是,我告诉Foo有一个泛型类型T和泛型生存期'a,在这个例子中,T是字符串,s的生存时间是'a?非常感谢jeff,你救了我一天非常感谢jeff,你救了我一天