for-loop - 简化迭代循环(使用 crate )

标签 for-loop enums rust

我有一个关于如何简化我的代码的问题

我正在使用 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/

相关文章:

Java/JSTL : is it a good idea to put all URLs in an enum?

rust - 什么是例子,它们有什么用?

rust - 在 Rust 中为 Option<number> 做 max 的惯用方法

for-loop - 转到如何正确使用 for ... range 循环

java - 重做 foreach 到 .stream().map

Java 文本冒险游戏 swing 组件未正确更新,每个函数运行时枚举被选择两次

java - 为此使用的最佳结构/模式?

winapi - Rust 中的 Win32 OpenGL 窗口 : unable to load certain function pointers

javascript - 迭代整个数组的标准 JavaScript 实践?

r - Union n igraphs后如何恢复属性?