幻影数据用例

2024-04-21

我试图理解 rust 中的 phantomData,我有一个 Foo 结构包裹着一个原始指针,我告诉编译器 Foo 不能比 'a 更长寿,所以我试图防止属性 v 的值在 Foo 之前被删除,但是我发现当 String s 可以在 f 之前删除时,它不起作用。我是不是误会了什么?

struct Foo<'a, T: 'a> {  // I say that T is valid over lifetime 'a
    pub v: *mut T,
    _mark: PhantomData<&'a T>
}

fn main() {
    let mut s = String::from("hello");
    let f = Foo {
        v: &mut s,
        _mark: PhantomData,
    };
    drop(s);  
    drop(f);
}

我发现我什至可以在 s 被删除后使用指向 s 的指针,如下所示

 let mut s = String::from("hello");
 let f = Foo {
     v: &mut s,
     _mark: PhantomData,
 };
 drop(s);
 let a = unsafe {&*f.v};
 println!("{}", a);

从评论中,我认为混乱来自于T: 'a和一生的推断。这的意思T: 'a https://doc.rust-lang.org/stable/rust-by-example/scope/lifetime/lifetime_bounds.html是任何生命周期参数T只要'a。对于一个类型T like String,没有生命周期参数,因此对于任何值都是如此'a包括'static.

大致说来,T: 'a意味着你可以持有一个类型的值T只要'a。它必须拥有自己的数据(例如String)或其包含的任何引用都必须存在足够长的时间。

因此当你初始化时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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

幻影数据用例 的相关文章

随机推荐

  • Java 中是否有与 Python 的 defaultdict 等效的工具?

    在 Python 中 defaultdict类提供了一种方便的方法来创建映射key gt list of values 在下面的示例中 from collections import defaultdict d defaultdict li
  • Bootstrap 模式确认表行删除

    我对网络工作非常陌生 我希望我能在这里得到一些有用的答案 我正在使用引导框架来设计一个网站 但遇到了一个小问题 我有一个表格 最后一个单元格中有一个删除按钮 我希望该按钮可以删除整行 我希望删除按钮激活引导模式以在删除之前确认表行删除 基本
  • Jenkins 未找到 SureFire 报告

    我已经在本地 jenkins 服务器中创建了一个 Maven 项目作业 项目 并添加了jenkin的TestNG插件来查看测试报告 但该作业没有显示我的 TestNg 结果 我看到以下错误 TestNG 报告处理 开始使用模式在工作区中查找
  • 使用 Backbone-Relational 实现多对多关系

    我有一个简单的应用程序 它定义了两个类 一个Person and a PersonGroup 其中存在多对多关系 一个人可以没有组 或者被分配到所有组 以及介于两者之间的任何组 backbonerelational org 上的示例建议对多
  • java中的@Documented注解

    目的是什么 Documentedjava中的注释 我看到了文档 但无法从中获得太多信息 有人可以通过一个清晰的例子指出 Documented是一个元注释 你申请 Documented定义注释时 确保使用您的注释的类在其生成的 JavaDoc
  • SGDClassifier 每次为文本分类提供不同的准确度

    我使用 SVM 分类器将文本分类为好文本和乱码 我正在使用 python 的 scikit learn 并按如下方式执行 Created on May 5 2017 import re import random import numpy
  • Pattern 和 type="email" 一起使用是否有问题?

    HTML5 电子邮件类型和模式 使用新的 HTML5 之间是否存在任何问题 冲突或其他问题 type值 例如email tel等 与pattern属性 我不是指 HTML5 浏览器兼容性 只是指这些属性的新值与pattern属性 为了清楚起
  • 我可以获得一个“有时可移植”的类库项目来加载到 Visual Studio Express 中吗?

    For 野田时间 http noda time googlecode com版本 1 1 的主要目标是构建可移植类库风格 主要是为了支持 Windows Phone 和 Windows Store 应用程序 这意味着失去一些功能 因此我们构
  • 使用未定义常量 CRYPT_SHA512

    我使用一个 php 脚本 该脚本使用 php 的 crypt 并使用 SHA512 对密码进行哈希处理 但是当我尝试检查 SHA512 是否已设置时 出现上述错误 当然我知道为什么我会收到这个错误 php 缺少一些依赖项 我只是不知道这种依
  • 符号 __module_registered 错误的重复定义

    我从 GHCi 收到一条关于 符号 module registered 的重复定义 的错误消息 如下所示 GHCi runtime linker fatal error I found a duplicate definition for
  • 如何在 swift 中检查 JSON 是否为 null?

    我目前正在开发一个应用程序 它可以返回 json 格式如下 location subtype 某个值 位置类型 强制 月份 2015 01 结果状态 类别 某个值 日期 某个值 如果 outcome status 具有值 则显示类别和日期
  • 如何在flutter中设置macos应用程序的默认大小?

    我正在尝试使用 flutter 构建 macOS 桌面应用程序 我希望应用程序是全宽 边到边的 但是 当我通过模拟器运行应用程序时 或者在构建之后 它总是启动大小为 800x600 的应用程序 我已将根容器的高度和宽度设置为 double
  • 如何用Hibernate实现3个多对多关系?

    我不能 100 确定这只是一个 Hibernate 问题 因为这可能是一个更抽象的决定 但我会尝试一下 由于问题描述有点长 我首先声明我想做的是看看是否可以将实现更改为更类似于最佳实践实现的东西 我有 3 个与此问题相关的实体 工作站 ws
  • 如何在 Ionic 3 中高效存储和使用身份验证

    我目前正在开发一个离子 3 4 适用于 iOS Android 的应用程序 我不熟悉身份验证过程或应用程序 在提供程序中使用 HTTP 请求后 我得到了我的对象 用户 但我完全不知道如何存储或处理它 有哪些好的做法 我是否应该将对象存储在提
  • 适用于 iPhone 视网膜显示屏的图像

    我有一个可以工作的应用程序 我已经在我的 iPod touch 上测试过了 一切都很好 我的标签栏图标和启动屏幕图像位于资源文件夹中的单独文件夹中 Resources gt images 现在 我知道对于 iPhone4 我需要使用 2x
  • 如何将列高设置为等于布尔玛(flexbox)中最长的列?

    我正在使用 Bulma 0 4 0 尽管答案可能与 Bulma 本身无关 如何将列高设置为与其他列相同 见下面的截图 编辑 codepen 包含更多显示实际行为的文本 https codepen io anon pen vmKVbx htt
  • Plon 全文索引 Excel 文件

    如何自定义 Plone 搜索引擎以激活 excel 文件的全文索引 我已经安装了 pdftotext 和 wv 用于 pdf word 文件全文索引 如果你添加产品 OpenXml https pypi python org pypi Pr
  • 在类中为其自己的字段使用 getter/setter 有什么好处吗? [复制]

    这个问题在这里已经有答案了 通常 在我自己的项目中 我使用 getter 和 setter 进行任何字段访问 并且我在工作中也遵循同样的做法 不久前 我们项目的技术负责人问我为什么要这样做 以及为什么这比仅仅使用字段本身更好 如果需要由子类
  • 由于频繁断网,repo 同步卡在 99%

    我尝试重新同步cyanogenmod源 一直到99 阶段 但是这个阶段好像有一个大文件 而且由于我的网络连接经常断开 所以无法下载它 每次发生断开连接时 fatal early EOF被打印出来 则repo sync停止 似乎在下次运行时
  • 幻影数据用例

    我试图理解 rust 中的 phantomData 我有一个 Foo 结构包裹着一个原始指针 我告诉编译器 Foo 不能比 a 更长寿 所以我试图防止属性 v 的值在 Foo 之前被删除 但是我发现当 String s 可以在 f 之前删除