#inline #const #consts #macro #pure #implemented

inline-const

作为宏实现的内联常量

2 个不稳定版本

0.1.0 2021 年 5 月 17 日
0.0.1 2021 年 5 月 15 日

#2126Rust 模式

MIT/Apache

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]
}

无运行时依赖