2个稳定版本
使用旧的Rust 2015
1.1.0 | 2017年9月18日 |
---|---|
1.0.0 | 2017年9月11日 |
#319 在 无标准库
在 3 crate 中使用
13KB
156 行
uncon
Rust中类型之间未检查转换的特质。
变更记录
有关 uncon
和 uncon_derive
的单独变更记录可供查看。
尽管它们的版本号可能不同,但 uncon_derive
总是与 uncon
的当前主要版本兼容。
安装
此crate可在 crates.io 上找到,可以通过将以下内容添加到项目的 Cargo.toml
中来使用:
[dependencies]
uncon = "1.1.0"
# Derive:
uncon_derive = "1.0.3"
用法
此项目允许在满足所有必要的不变量假设的情况下在类型之间进行转换。
例如,Value
实例必须具有从 0 到 2 的位模式。
#[macro_use]
extern crate uncon_derive;
extern crate uncon;
use uncon::*;
#[derive(FromUnchecked, PartialEq)]
#[repr(u8)]
enum Value {
X, Y, Z
}
fn main() {
let v = unsafe { Value::from_unchecked(2) };
assert_eq!(v, Value::Z);
// Undefined behavior:
let u = unsafe { Value::from_unchecked(3) };
}
为了允许安全(但可能较慢)的转换,也可以通过 From<T>
通过 FromUnchecked<T>
实现,其中使用掩码或其他操作来使输入值有效
impl From<u8> for Value {
fn from(bits: u8) -> Value {
unsafe { Value::from_unchecked(bits % 3) }
}
}
一些类型 已经默认实现了 FromUnchecked
。
定义行为
此项目不是通过创建混乱来逃避 未定义行为 的借口。这些操作仅应在速度至关重要且绝对确定不会导致奇怪行为的情况下执行。
不要总是求助于 mem::transmute
。通常有 替代方案。 这里 是应避免它的原因列表。
许可证
此项目可在您选择的情况下发布为以下许可证之一:
任选其一。