< 返回版块

tottiandlsg 发表于 2023-01-02 12:00

最近在看RefCell相关的标准库源代码的实现,对Ref和RefMut的实现有一点疑问,向大家请教一下,为什么在RefMut的实现中要加入幽灵数据的成员?

pub struct Ref<'b, T: ?Sized + 'b> {
    value: NonNull<T>,
    borrow: BorrowRef<'b>,
}

pub struct RefMut<'b, T: ?Sized + 'b> {
    value: NonNull<T>,
    borrow: BorrowRefMut<'b>,
    // `NonNull` is covariant over `T`, so we need to reintroduce invariance.
    marker: PhantomData<&'b mut T>,
}

看注释的内容是引入不变性,但是不太理解

看了一下PhantomData的介绍,说是主要用于生命周期和类型相关参数没有使用的情况,但是感觉上面情景不是特别符合。

感谢各位大神的解答!

评论区

写评论
github.com/shanliu/lsys 2023-01-05 20:51

简单点说就是为了把可变引用的生命周期跟范型关联

苦瓜小仔 2023-01-02 12:21

只能建议你先理解 invariance/covariance :)

Variance in Rust: An intuitive explanation

1 共 2 条评论, 1 页