我有一个关于如何简化我的代码的问题
我正在使用 crate (https://docs.rs/strum/0.17.1/strum/),我的问题是如何在不传递for循环的情况下将.iter()(宏EnumIter)简化为数组编号
const文件:
#[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
}
最佳答案
您想要 Iterator::enumerate
:
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)
}
关于for-loop - 简化迭代循环(使用 crate ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59544953/