3 个不稳定版本
使用旧的 Rust 2015
0.2.0 | 2018 年 12 月 14 日 |
---|---|
0.1.1 | 2018 年 12 月 13 日 |
0.1.0 | 2018 年 11 月 25 日 |
#5 in #interior
12KB
93 行
Sealing Slice
该软件包实现了一个可以将其初始部分从可变性中密封的切片,并将密封部分作为不可变引用分发的功能。
软件包尺寸
这是一个非常小的软件包,只有大约十几行有效代码。
它仍然作为一个独立的软件包提供,以清楚地封装该软件包的保证,并为其提供一些测试和稳定性,而不是同构概念的临时实现。
所有不安全性都被封装在单个函数 coalesce
中,该函数断言其参数切片在内存中形成一个连续的区域,因此可以将其视为单个切片。SealingSlice 构造确保这一断言不会被违反。
何时(不)使用
如果标准库没有提供安全的方式来分割所需的内容,则应仅使用此软件包。
你需要使用此软件包的指标是你需要拥有长期存在的不可变切片的数据,后来需要包含之前的数据的切片,当时第一个请求时该数据仍在被修改。
如果你只需在修改完你的数据后分割数据的一部分,并且不需要访问之前的或重叠的区域,slice::split_at_mut 就是你的好朋友。如果你的分割函数是具有对切片引用的结构的成员方法,你可能需要暂时将可变切片移出它(并在其位置正式留下 &[]
),以保持完整的生命周期。请参阅 问题 1 的示例。在这些情况下,你 不需要使用 此软件包。
路线图
由于接口变化不大,此软件包很快可以版本化为 1.0。
在 API 上考虑的变体
-
实现 SealingSlice 上的 Index 和 IndexMut 操作。通过不可变索引访问会在密封后尝试访问时引发 panic(特别是通过未完全密封的切片的端开放区间),而可变索引在访问已密封区域时也会同样出错。
对于在固定偏移量处访问可变区域的用户,这意味着减少计算当前可变视图中的位置。
在代码行数上,实现将超过当前的代码,因为需要覆盖所有 Range、RangeFrom、RangeToInclusive 等的变体。
-
如果需要将切片密封在除其第一个字节之外的不同部分(例如,它们的尾部、一个连续的区域,甚至任意数量的区域),那么将这些切片添加到这个crate中是有意义的(因为它们的安全性属性评估可以共享),但这种需求尚未出现。
前者仍然可以通过使用这个crate的稳定化来实现;后者可能差异太大,可能需要单独实现。
crate状态
作者使用这个crate的主要用例(启用serde-cbor的no_std使用 已被一个审阅者在 问题#1 中指出的一种替代实现方式所取代。拥有SealingSlice仍然有价值,因此这个crate仍然保持活跃,但——根据其他用例的发展情况——这个crate目前被声明为“被动维护”。