for-loop - 为迭代简化 for 循环(使用 crate 弹奏)
问题描述
我有一个关于如何简化我的代码的问题
我正在使用板条箱弹奏(https://docs.rs/strum/0.17.1/strum/),我的问题是如何在不传入 for 循环的情况下将 .iter() (宏 EnumIter)简化为数组编号
常量文件:
#[derive(Debug, Clone, Display, EnumIter)]
pub enum Signs {
Aries = 1,
Taurus = 2,
Gemini = 3,
Cancer = 4,
Leo = 5,
Virgo = 6,
Libra = 7,
Scorpio = 8,
Sagittarius = 9,
Capricorn = 10,
Aquarius = 11,
Pisces = 12,
}
和代码:
extern crate math;
use crate::sweconst::Signs;
use math::round;
use strum::IntoEnumIterator;
pub fn myfunction(ddeg: f64) -> Signs {
// Convert deg to sign 30°
let sign_calc = round::half_up(ddeg / 30.0, 0) as i32;
// And the ugly code
let mut sign = Signs::Aries;
let mut i = 0;
for s in Signs::iter() {
i += 1;
if i == sign_calc as i32 {
sign = s;
break;
}
}
sign
}
解决方案
for (i, s) in Signs::iter().enumerate() {
if (i + 1) == sign_calc {
sign = s;
break;
}
}
这里i
是从零开始的,因此您可能需要相应地调整代码。
事实上,它可以进一步简化并更容易阅读:
pub fn myfunction(ddeg: f64) -> Signs {
let sign_calc = round::half_up(ddeg / 30.0, 0) as usize;
Signs::iter().nth(sign_calc - 1).unwrap_or(Signs::Aries)
}
推荐阅读
- oracle - 创建触发器时出现编译错误
- json - 发布到 Web Api 时实体类型的子级为空
- powerbi - 折线图中的数据点和直线
- python - 如何在 Python 中将数据从一个类传输到另一个类?
- c# - 如何避免使用 new 关键字进行实例化?
- firebase - Firebase 计划功能 - 无法部署
- c# - 将数据传递给 MVC 控制器时如何在单个参数中获取文件路径
- html - 在 nuxt.js 中使用 width:100vw 时有额外的空白
- php - 如何在 PHP 和 XML 中使用 foreach
- javascript - 有什么方法可以在课前或课后添加链接吗?