当前位置:  开发笔记 > 后端 > 正文

如何将枚举中的元素(变体)数量作为常量值?

如何解决《如何将枚举中的元素(变体)数量作为常量值?》经验,为你挑选了1个好方法。

有没有办法提取枚举中的元素数量?

简单的例子(用虚构的number_of_elements方法):

enum FooBar { A = 0, B, C, };

println!("Number of items: {}", FooBar.number_of_elements());
// "Number of items: 3"

在C中,我通常会......

enum FooBar { A = 0, B, C, };
#define FOOBAR_NUMBER_OF_ITEMS (C + 1)

但是相当于Rust的Rust不起作用:

enum FooBar { A = 0, B, C, };
const FOOBAR_NUMBER_OF_ITEMS: usize = (C as usize) + 1;

// Raises an error:
//     unimplemented constant expression: enum variants

包括枚举中的最后一项是非常不方便的,因为如果不考虑所有成员,匹配的枚举将会出错.

enum FooBar { A = 0, B, C, FOOBAR_NUMBER_OF_ITEMS, };

有没有办法将枚举中的项目数作为常量值?


注意:即使这与问题没有直接关系,我之所以想要这个功能,是因为我正在使用构建器模式构建一系列只运行一次的操作.出于这个原因,我可以使用枚举大小的固定大小的数组.



1> oli_obk..:

您可以使用新的程序宏(在撰写本答案之日起2周内稳定):

extern crate proc_macro;
extern crate syn;
#[macro_use]
extern crate quote;

use proc_macro::TokenStream;

#[proc_macro_derive(EnumVariantCount)]
pub fn derive_enum_variant_count(input: TokenStream) -> TokenStream {
    let syn_item: syn::DeriveInput = syn::parse(input).unwrap();
    let len = match syn_item.data {
        syn::Data::Enum(enum_item) => enum_item.variants.len(),
        _ => panic!("EnumVariantCount only works on Enums"),
    };
    let expanded =quote! {
const LENGTH: usize = #len;
    };
    expanded.into()
}

它留给读者一个练习,以确保这个派生宏可以在同一个模块中多次使用.

要使用宏,只需附加#[derive(EnumVariantCount)]到您的枚举.现在应该有一个名为的全局常量LENGTH.


好吧,也许我没想得够.但至少*I*会期望将`#[derive(EnumVariantCount)]`附加到结构定义会导致编译时错误.
对......命名很不幸.如果它被添加到结构中,那可能是一个错误.
推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有