首页 > 解决方案 > 为迭代简化 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-loopenumsrust

解决方案


你想要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)
}

推荐阅读