1 个不稳定版本
使用旧的 Rust 2015
0.0.0 | 2019年11月7日 |
---|
#138 in #assert
6KB
Rust 的编译时断言,由 Nikolai Vazquez 提供。
此库允许您确保关于常量、类型等的正确假设。有关更多信息,请参阅文档和常见问题解答!
安装
此 crate 可在crates.io上找到,您可以通过将以下内容添加到项目的Cargo.toml
中来进行使用
[dependencies]
static_assertions = "1.1.0"
以及此内容添加到 crate 根目录(main.rs
或lib.rs
)
#[macro_use]
extern crate static_assertions;
使用方法
此 crate 暴露以下宏
assert_cfg!
assert_eq_align!
assert_eq_size!
assert_eq_size_ptr!
assert_eq_size_val!
assert_fields!
assert_impl_all!
assert_impl_any!
assert_impl_one!
assert_not_impl_all!
assert_not_impl_any!
assert_obj_safe!
assert_trait_sub_all!
assert_trait_super_all!
assert_type_eq_all!
assert_type_ne_all!
const_assert!
const_assert_eq!
const_assert_ne!
常见问题解答
-
问题:我什么时候会想使用这个库?
答案:当您想要确保常量、类型和特质的属性时,此库非常有用。
基本示例
-
随着 1.39 版本的发布,
str::len
可以在一个const
上下文中被调用。使用const_assert!
,可以检查从其他地方生成的字符串是否具有给定的大小const DATA: &str = include_str!("path/to/string.txt"); const_assert!(DATA.len() < 512);
-
有一个绝对必须实现某些特质的类型吗?使用
assert_impl_all!
可以确保这一点struct Foo { value: // ... } assert_impl_all!(Foo: Send, Sync);
-
-
问题:我如何贡献?
答案:有几种方式!您可以
-
尝试提出一些您希望实现的静态分析形式。创建一个新问题并描述您如何想象您的断言工作,并附上示例代码进行演示。
-
实现自己的静态断言并创建一个 Pull Request。
-
提供反馈。有哪些痛点?哪里让人不愉快?
-
编写文档。如果你熟悉这个库的工作方式,与其他用户分享你的知识将非常棒!
-
-
问:这会影响我的编译二进制文件吗?
答:不会!使用这个库没有运行时成本,因为所有检查都是在编译时进行的,因此不会生成运行代码。
-
问:这会影响我的编译时间吗?
答:可能不会引起任何可感知的变化。如果这是一个问题,可以将这个库放在
dev-dependencies
[dev-dependencies] static_assertions = "1.1.0"
中,然后可以在
#[cfg(test)]
#[cfg(test)] const_assert_eq!(MEANING_OF_LIFE, 42);
然而,断言只有在运行
cargo test
-
问:
const _
是什么意思?答:这是一种创建未命名常量的方法。这样做是为了让宏可以在全局范围内调用而不需要唯一的标签。这个库利用了评估
const
表达式的副作用。有关该功能的更多信息,请参阅 跟踪问题 和 问题 #1。
更改
请参阅 CHANGELOG.md
了解不同版本之间有哪些变化。
许可
该项目可以在您选择的情况下发布
。