Rust crate使用求助:#[repr(...)]缺失及from_int方法调用报错
问题解决:int_enum crate 使用报错处理
我正在完成Exercism中一个关于使用外部crate的简单任务,编写了如下代码:
use int_enum::IntEnum; #[derive(Debug, PartialEq, Eq, IntEnum)] pub enum ResistorColor { Black = 0, Brown = 1, Red = 2, Orange = 3, Yellow = 4, Green = 5, Blue = 6, Violet = 7, Grey = 8, White = 9, } pub fn value_to_color_string(value: u32) -> String { match ResistorColor::from_int(value) { Ok(r) => format!("{:?}", r), Err(r) => "value out of range".to_string(), } }
运行时遇到两个错误:
- 提示错误:
no #[repr(...)] found - 调用
from_int方法时收到错误:
items from traits can only be used if the trait is implemented and in scope the following trait defines an item 'from_int', perhaps you need to implement it: candidate #1: 'IntEnum'
查看同类解决方案写法一致,需要解决建议。
解决步骤
- 添加#[repr(...)] 属性:int_enum crate要求枚举必须指定底层整数的表示类型,因为它依赖这个信息实现整数与枚举的转换。给
ResistorColor枚举添加#[repr(u32)](和你枚举成员的值类型匹配),可以放在derive宏的同一行或单独一行。 - 确认IntEnum trait在作用域内:你已经通过
use int_enum::IntEnum;导入了trait,第二个错误本质是缺少repr属性导致derive宏未生成正确的trait实现,解决第一个问题后该错误会自动消失。
修正后的完整代码
use int_enum::IntEnum; #[derive(Debug, PartialEq, Eq, IntEnum)] #[repr(u32)] // 新增的repr属性 pub enum ResistorColor { Black = 0, Brown = 1, Red = 2, Orange = 3, Yellow = 4, Green = 5, Blue = 6, Violet = 7, Grey = 8, White = 9, } pub fn value_to_color_string(value: u32) -> String { match ResistorColor::from_int(value) { Ok(r) => format!("{:?}", r), Err(_) => "value out of range".to_string(), } }
说明
#[repr(u32)]告诉Rust将枚举的底层整数类型设为u32,和你定义的枚举成员值类型一致,这是int_enum crate正常工作的必要条件。- 第二个错误是派生宏未正确生成IntEnum实现导致的,补上repr属性后,derive宏会自动生成
from_int方法的实现,编译器就能找到该方法了。
内容的提问来源于stack exchange,提问作者Fabian Thorsen
相关产品推荐
相关产品推荐

