Rust 幻影数据用例

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的任何值都是如此

我试图理解rust中的phantomData,我在一个原始指针周围有一个Foo结构,我告诉编译器Foo不能比'a寿命长,所以我试图防止在Foo之前删除属性v的值,但我发现它不起作用,因为字符串s可以在f之前删除。我误解了什么吗

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,你救了我一天