#static #assert

无 std proc_static_assertions_next

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

1 个不稳定版本

0.0.1 2024年1月16日

#144#assert


用于 static_assertions_next

MIT/Apache

13KB

Banner

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

这个库允许您确保关于常量、类型等的正确假设。请参阅 文档常见问题解答 以获取更多信息!

安装

此包在 crates.io 上可用,可以通过将以下内容添加到项目的 Cargo.toml

[dependencies]
static_assertions = "1.1.0"

并添加到 crate 根目录(main.rslib.rs

#[macro_use]
extern crate static_assertions;

使用方法

此包公开以下宏

常见问题解答

  • 问题:我何时会想使用这个库?

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

    基本示例

    • 随着 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);
      
  • 问题:我如何贡献?

    答案:有几种方法!您可以

    • 尝试提出一些您希望实现的形式静态分析。创建一个新问题,并描述您想象中的断言如何工作,附上示例代码进行演示。

    • 实现您自己的静态断言并创建一个拉取请求

    • 提供反馈。有哪些痛点?在哪里感到不愉快?

    • 编写文档。如果您熟悉这个库的工作方式,与库的其他用户分享您的知识将是极大的帮助!

  • 问:这会影响我的编译后的二进制文件吗?

    答:不会!使用这个库没有运行时成本,因为所有检查都是在编译时进行的,因此不会生成代码来运行。

  • 问:这会影响我的编译时间吗?

    答:可能不会对任何可感知的程度产生影响。如果这是您的顾虑,可以将此库放入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以了解从一个版本到另一个版本的所有更改。

许可证

此项目可根据您的选择发布为以下任一许可证:

无运行时依赖

功能