一、PhantomData
PhantomData这个类型在rust中经常看到,但往往让人感觉到晕,不知道为什么要用到。

简单来说:有一些场合,你表示(marker)拥有它,但并不使用它。
这个可能时生命周期,也可能是一种借用,也可能是包括一种类型。

所在库的路径上,std::marker::PhantomData,从这个你也可感觉到什么意思。

在标准库的说明中,我们可以了解到:

有二个场景下,经常会用到:
1、有没有用到的生命周期参数时(Unused lifetime parameters)
比如,有一个Slice,但是要求他的参数是‘a,但是在参数中,又没有’a来约束。如何办?

struct Slice<'a, T> {start: *const T,end: *const T,
}

你可以改造成:

use std::marker::PhantomData;struct Slice<'a, T: 'a> {start: *const T,end: *const T,phantom: PhantomData<&'a T>,
}

这样,Slice就可以明确约定为’a了。

在具体初始化时,PhantomData往往不需要带生命周期参数,如:

fn borrow_vec<'a, T>(vec: &'a Vec<T>) -> Slice<'a, T> {let ptr = vec.as_ptr();Slice {start: ptr,end: unsafe { ptr.add(vec.len()) },phantom: PhantomData,}
}

2、在FFI下,有没有用到的类型参数时(Unused type parameters)

It sometimes happens that you have unused type parameters which indicate what type of data a struct is “tied” to, even though that data is not actually found in the struct itself. Here is an example where this arises with FFI. The foreign interface uses handles of type *mut () to refer to Rust values of different types. We track the Rust type using a phantom type parameter on the struct ExternalResource which wraps a handle.

use std::marker::PhantomData;
use std::mem;struct ExternalResource<R> {resource_handle: *mut (),resource_type: PhantomData<R>,
}impl<R: ResType> ExternalResource<R> {fn new() -> ExternalResource<R> {let size_of_res = mem::size_of::<R>();ExternalResource {resource_handle: foreign_lib::new(size_of_res),resource_type: PhantomData,}}fn do_stuff(&self, param: ParamType) {let foreign_params = convert_params(param);foreign_lib::do_stuff(self.resource_handle, foreign_params);}
}

3、具体的例子:Context

pub struct Context<'a> {waker: &'a Waker,// Ensure we future-proof against variance changes by forcing// the lifetime to be invariant (argument-position lifetimes// are contravariant while return-position lifetimes are// covariant)._marker: PhantomData<fn(&'a ()) -> &'a ()>,
}impl<'a> Context<'a> {/// Create a new `Context` from a `&Waker`.#[inline]pub fn from_waker(waker: &'a Waker) -> Self {Context {waker,_marker: PhantomData,}}
}

4、几种形式

marker: PhantomData<&'a T>,
marker: PhantomData<& T>,
marker: PhantomData<T>,
marker: PhantomData<*mut () >,

二、PhantomPinned
A marker type which does not implement Unpin.
If a type contains a PhantomPinned, it will not implement Unpin by default.

Rust :PhantomData、PhantomPinned相关推荐

  1. 《rust程序设计、入门和进阶》

    <rust程序设计.入门和进阶>正式和清华大学出版社签约.本书由华中科技大学软件学院的老师合力编著,期待以在战争中学会战争,游泳中学会游泳的方式帮助读者度过学习Rust编程语言的困难期,快 ...

  2. Rust的前景怎么样?值不值的学—Rust对比、特色和理念

    前言 其实我一直弄不明白一点,那就是计算机技术的发展,是让这个世界变得简单了,还是变得更复杂了. 当然这只是一个玩笑,可别把这个问题当真. 然而对于IT从业者来说,这可不是一个玩笑.几乎每一次的技术发 ...

  3. 初学rust——Iterators、Closures、Crates.io and Pointers

    学习rust的第五.六天,学习资料是官网的<The Rust Programming Language>,本笔记的内容包括第13-15章的内容 Chapter 13 Functional ...

  4. Warp:一款融资 23000000 美元,基于 Rust 开发、支持 GPU 加速的 21 世纪终端工具...

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! Warp 是一个完全原生的.GPU 加速的基于 Rust 开发的终端工具,速度非常快,完全从头重新设计,Warp ...

  5. Rust巨型挖掘机使用教程、Rust音乐播放器功能

    一.巨型挖掘机计算器及教程 很多玩家不清楚巨型挖掘机的使用及出矿率,本次更新推出了巨型挖掘机计算器,及教程列表,矿机调整后,这收益惊人,基本上挖上个把小时可以扛到清档. 矿机计算器.教程列表 二.巨型 ...

  6. 新风向标:学术界开始从 Python 转向 Rust

    作者 | Jeffrey M. Perkel 策划 | Tina 来源 | Rust语言中文社区 Rust 现在已经越来越受到科学家们的欢迎了,比起 Python,Rust 有着更高效的性能,同时在社 ...

  7. rust为什么显示不了国服_AWS偏爱Rust,已将Rust编译器团队负责人收入囊中

    机器之心报道 作者:张倩.杜伟 近日,AWS 透露,该公司已经聘用了 Rust 编译器团队负责人之一 Felix Klock.该消息出自 AWS 开源团队于上周二发布的一篇文章<Why AWS ...

  8. 与 Rust 社区亲密接触!Rust 大会火热报名!

    首先抢票:www.huodongxing.com/event/64794- 大会官网:rustcon.asia 2019 年 4 月 20 日在北京望京凯悦,在秘猿科技与 PingCAP 携手下,我们 ...

  9. 编程语言“鄙视链” +1?亚马逊力捧 Rust,Go 技术负责人连发 14 条推特抵制“拉踩”

    整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 每个领域总有一些说不清道不明的"鄙视链",在程序员圈中尤是如此.从编程语言.编辑器.工具,到浏览器.服务器系统,甚至 ...

  10. 编程语言“鄙视链” +1?亚马逊力捧 Rust,Go 技术负责人连发 14 条推特抵制“拉踩”...

    整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 每个领域总有一些说不清道不明的"鄙视链",在程序员圈中尤是如此.从编程语言.编辑器.工具,到浏览器.服务器系统,甚至 ...

最新文章

  1. Linux里检查的一些目录!
  2. 「模型解读」从2D卷积到3D卷积,都有什么不一样
  3. 阿里云服务器外网访问问题
  4. linux面试题中的简答题,Linux面试题(简答题部分)
  5. mac 雪豹 10.6 五国
  6. JSON格式以及基本用法
  7. Linux按键输入实验(体验一下输入驱动,实际开发使用input子系统处理)
  8. 《计算机算法设计与分析》题目汇总
  9. C++笔记-空指针加强、auto自动类型
  10. python实现TCP客户端从服务器下载文件
  11. AAAI 2020 | 北理工阿里文娱:你所看视频的介绍,可以用到这样的「图像描述」技术...
  12. c 语言 宏 默认参数,C/C++预处理宏可以使用默认参数值吗?
  13. fatal: “Could not read remote” -- Mac下使用Git Push显示权限错误
  14. 狗年出生的宝宝取名都有哪些注意事项呢?起名真不是简单事
  15. 计算机仿真软件multisim,电路仿真软件哪个好?2019电路仿真软件推荐
  16. 视频通信中的码率控制算法
  17. winhex可以编程c语言吗,如何用winhex解密加了密的mp4视频
  18. 如何屏蔽WPS广告弹窗
  19. SEO外链软件-免费批量网站发布SEO外链
  20. 深入ActiveMQ

热门文章

  1. 用DD-WRT自建计费WiFi热点
  2. 怎样以最快的速度导入mysql
  3. JS 初级 二(接上)
  4. Android Sqlite 工具类封装
  5. .net 调用Oracle 的一些总结。
  6. smartplant license manager issue
  7. Visual Studio 2017 vcvarsall.bat 环境配置对应关系
  8. pytest框架(三)
  9. Python安装学习
  10. js--属性和方法(私有/公有)