< 返回版块

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

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

shuimuliang 2023-01-02 15:30

rustc --emit=llvm-ir -O main.rs

底层实现参考LLVM IR的lifetime https://llvm.org/docs/LangRef.html#object-lifetime

shuimuliang 2023-01-02 15:17

先回复问题本身: PhantomData的存在是为了满足lifetime checker. 这个是在编译期实现的.

前置知识点为:

  1. rust的每个类型,具备其生命期。通过类型的生命期,进行生命期检查. 所以 unbounded lifetimes and types are forbidden in struct definitions.

  2. Subtyping and Variance (生命期)的子类型和协变 https://www.notion.so/Subtyping-and-Variance-3f0f015665744695ba7f22acde1bd2b0

具体说明文章 3.10 小节 https://doc.rust-lang.org/nomicon/ https://learnku.com/docs/nomicon/2018

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

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

Variance in Rust: An intuitive explanation

1 共 4 条评论, 1 页