#static #assert

无 std proc_static_assertions

编译时断言,通过过程宏实现

1 个不稳定版本

使用旧的 Rust 2015

0.0.0 2019年11月7日

#138 in #assert

MIT/Apache

6KB

Banner

Rust 的编译时断言,由 Nikolai Vazquez 提供。

此库允许您确保关于常量、类型等的正确假设。有关更多信息,请参阅文档常见问题解答

安装

此 crate 可在crates.io上找到,您可以通过将以下内容添加到项目的Cargo.toml中来进行使用

[dependencies]
static_assertions = "1.1.0"

以及此内容添加到 crate 根目录(main.rslib.rs

#[macro_use]
extern crate static_assertions;

使用方法

此 crate 暴露以下宏

常见问题解答

  • 问题:我什么时候会想使用这个库?

    答案:当您想要确保常量、类型和特质的属性时,此库非常有用。

    基本示例

    • 随着 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 了解不同版本之间有哪些变化。

许可

该项目可以在您选择的情况下发布

没有运行时依赖

特性