【问题标题】:Can. we condense multiple related loops?能。我们浓缩了多个相关的循环?
【发布时间】:2021-04-11 18:45:12
【问题描述】:

这里只是一个学习 Rust 的新手。

当您有多个循环时,如本例所示。是否有一种简单/惯用的生锈方法将它们全部组合成一个循环?或者也许只是一种更聪明的方法?

游乐场链接:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=1d4893a0688a1ccb9fb4fc1c684dfe38

代码

#[derive(Debug)]
enum USCoin {
    Penny,
    Nickel,
    Dime,
    Quarter,
    HalfDollar
}

fn make_change(mut value: f64) -> Vec<USCoin> {
    let mut change: Vec<USCoin> = vec![];
    while value >= 0.50 && value > 0.25 {
        change.push(USCoin::HalfDollar);
        value = value - 0.50;
    }
    
    while value >= 0.25 && value > 0.10 {
        change.push(USCoin::Quarter);
        value = value - 0.25;
    }
    
    while value >= 0.10 && value > 0.05 {
        change.push(USCoin::Dime);
        value = value - 0.10;
    }
    while value >= 0.05 && value > 0.01 {
        change.push(USCoin::Nickel);
        value = value - 0.05;
    }
    while value >= 0.01 && value != 0.0{
        change.push(USCoin::Penny);
        value = value - 0.01;
    }
    
    return change;
}

fn main() {
    let change: Vec<USCoin> = make_change(2.43);
    println!("{:?}", change);
}

【问题讨论】:

  • 鉴于这是有效的代码,并且您正在寻找改进(一个令人钦佩的目标),您可能会在 Code Review StackExchange 上获得更好的运气,这是一个专门为此目的而构建的网站。
  • 请注意,您的测试是多余的:value &gt;= 0.50 &amp;&amp; value &gt; 0.25 仅相当于 value &gt;= 0.50
  • 强制性警告:切勿使用浮点数数钱
  • 我通过这个很快了解到...我最终使用了像“134”这样的值,然后除以 100 得到 1.34。非常好的建议警告 Krish!

标签: rust


【解决方案1】:

是的,有一种方法可以避免复制粘贴循环,方法是在循环中使用 match

fn make_change(mut value: f64) -> Vec<USCoin> {
    use USCoin::*;
    let mut change: Vec<USCoin> = vec![];
    while value > 0.001 {
        let (coin, coin_value) = match value {
            _ if value >= 0.50 => (HalfDollar, 0.50),
            _ if value >= 0.25 => (Quarter, 0.25),
            _ if value >= 0.10 => (Dime, 0.10),
            _ if value >= 0.05 => (Nickel, 0.05),
            _ if value >= 0.01 => (Penny, 0.01),
            _ => unreachable!(),
        };
        change.push(coin);
        value -= coin_value;
    }
    change
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多