rust - 使用 Send trait 标记包含 !Send 字段的类型背后的原因是什么?
问题描述
用trait标记包含!Send
字段(likeRc
或NonNull
)的类型背后的原因是什么?Send
例如,标准库LinkedList
以这种方式工作:它包含Option<NonNull<_>>
字段并实现Send
trait(when T
is Send
)。
这如何安全,使用这种类型安全工作的保证和方法是什么?
解决方案
看看存在的理由:NonNull
!Send
NonNull
指针不是Send
因为它们引用的数据可能有别名。
但是NonNull
inLinkedList
是一个私有的实现细节。如果此类型知道内部类型T
是Send
并且它的用法也是Send
-safe,(在公共 API 中没有不安全性),那么它可以重新引入该Send
trait。
该保证基本上可以确保您无法获得内部类型的可变别名;并确保没有意外的内部可变性(从不可变的引用获取可变引用)。
这些保证不是由提供的,NonNull
而是在LinkedList
.
推荐阅读
- r - 从 R 导出西里尔字符?
- python - 我可以在异步协程上使用阻塞锁吗?
- tensorflow - tensorflow.keras.preprocessing.text.Tokenizer.texts_to_matrix 有什么作用?
- ios - 尝试在 Network.Framework 中使用 NWConnection 时出现问题
- javascript - 如何将随机大小的图像排列成等长的行?
- powershell - 将 PowerShell 变量传递给文件路径
- html - 将数据传递给 ionic 5 自定义元素标签
- javascript - poseNet on react native 导致 FileReader 错误
- android - 如何修复此错误类“列表”
' 没有实例获取器 'fruitsItemsList'。接收方:“_GrowableList”的实例(长度:1)? - node.js - Socket.io:覆盖的 generateId() 被执行,但返回的 id 似乎被忽略了