2 个不稳定版本
0.1.0 | 2021 年 5 月 17 日 |
---|---|
0.0.1 | 2021 年 5 月 15 日 |
#2126 在 Rust 模式
9KB
78 行
inline-const
你不想等到 内联常量 稳定吗?这个crate提供了纯宏实现的内联常量的大部分功能,但略有不便:你需要显式注释常量的类型。
use std::net::Ipv6Addr;
use inline_const::inline_const;
fn mock_ip(use_localhost: bool) -> &'static Ipv6Addr {
if use_localhost {
&Ipv6Addr::LOCALHOST
} else {
inline_const! { [&'static Ipv6Addr]
&Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 0)
}
}
}
与当前不稳定内联常量实现不同,这个crate甚至支持依赖于泛型参数的常量,尽管需要额外的注释成本:你需要重复常量所引用的泛型参数及其生命周期限制。
use inline_const::inline_const;
fn make_static_vec<T: 'static>() -> &'static Vec<T>{
inline_const! { <T: 'static> [&'static Vec<T>] &Vec::new() }
}
静态断言
这可以用来实现依赖于泛型参数的静态断言
use inline_const::inline_const;
#[allow(unconditional_panic)]
const fn assert(b: bool) {
if !b {
["const assertion failed"][1];
}
}
fn size_at_least_2<T>() {
inline_const!{ <T> [()] assert(std::mem::size_of::<T>() >= 2)};
}
fn const_at_least_2<const N: usize>() {
inline_const!{ <const N: usize> [()] assert(N >= 2)};
}
// When an inline const depends on both types and const generics, a `;` must be used
// to separate the two.
fn size_at_least<T, const N : usize>() {
inline_const!{ <T; const N: usize> [()] assert(std::mem::size_of::<T>() >= N)};
}
size_at_least_2::<i32>();
//size_at_least_2::<i8>();
const_at_least_2::<4>();
//const_at_least_2::<1>();
size_at_least::<i8, 1>();
//size_at_least::<i8, 2>();
常量数组
最近以来,[C; N]
对任何常量 C
都有效,即使是非 Copy
类型。然而,没有内联常量,这有点令人烦恼。这个crate提供了 const_array!
宏来帮助这种情况
use inline_const::const_array;
fn make_i32_vecs() -> [Vec<i32>; 5] {
// [Vec::new(); 5]: rejected since `Vec::new` is not a constant.
const_array![ [Vec<i32>] Vec::new(); 5]
}
fn make_vecs<T>() -> [Vec<T>; 5] {
// Generic parameters used in the const expression must be explicitly specified:
const_array![<T> [Vec<T>] Vec::new(); 5]
}
fn make_n_vecs<T, const N: usize>() -> [Vec<T>; N] {
const_array![<T> [Vec<T>] Vec::new(); N]
}