【问题标题】:Ruby - Returning LATEST condition matched, not first condition matchedRuby - 返回匹配的最新条件,而不是匹配的第一个条件
【发布时间】:2018-01-21 05:48:25
【问题描述】:

下面的假设案例陈述考虑了三个变量:

  • 姓名
  • 年龄
  • 大蒜过敏

使用下面的 case 语句,目标是将“结果”变量更新为 LATEST 条件,而不是第一个条件匹配。例如如果用户输入变量 age=90、garlic_allergy=false、name=Dracula,case 语句应该返回“Definitely a vampire”(满足最新条件)而不是“Probably NOT a vampire”(满足第一个条件) .

    case
    when age.to_i < 100 && garlic_allergy = false
      result = "Probably NOT a vampire"
    when age.to_i < 100 && garlic_allergy = true 
      result = "Maybe a vampire"
    when age.to_i > 100 && garlic_allergy = true
      result = "almost certainly a vampire"
    when name = "Dracula"
      result = "Definitely a vampire"
    else
      result = "Results inconclusive"  
    end

    puts result
    end

这是一个示例案例,但试图弄清楚如何对任何 case 语句或具有多个条件的 if/elsif/else 语句等执行此操作......如何确保程序在每个 when/elsif 中运行语句并返回最新的条件。我尝试通过将语句包装在一个循环中来做到这一点,但还没有任何运气。

【问题讨论】:

    标签: ruby if-statement switch-statement boolean conditional-statements


    【解决方案1】:

    根据您的条件构建数组

    conditions = []
    
    conditions.push lambda { |name, age, garlic_allergy|
      'Probably NOT a vampire' if age < 100 and not garlic_allergy
    }
    
    conditions.push lambda { |name, age, garlic_allergy| 
      'Maybe a vampire' if age < 100 and garlic_allergy
    }
    
    conditions.push lambda { |name, age, garlic_allergy|
      'almost certainly a vampire' if age > 100 and garlic_allergy
    }
    
    conditions.push lambda { |name, age, garlic_allergy|
      'Definitely a vampire' if name == 'Dracula'
    }
    

    并将你的条件减少到最后一个成功的条件。

    result = conditions.inject('Results inconclusive') { |current, x|
      r = x.(name, age, garlic_allergy)
    
      r != nil ? r : current
    }
    

    注意inject的初始值是回退条件,在没有条件成功的情况下会保留。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 2021-06-17
      • 2021-05-13
      • 1970-01-01
      • 2012-12-31
      相关资源
      最近更新 更多