【问题标题】:Conditional value extraction from ruby hash从 ruby​​ 哈希中提取条件值
【发布时间】:2013-04-05 17:56:57
【问题描述】:

我的应用程序的用户有他们的观点。我想根据他们的分数为他们分配不同的等级。这是我的排名映射哈希:

RANKS = { (1..20)     => 'Private'
          (21..40)    => 'Corporal'
          (41..60)    => 'Sergeant'
          (61..80)    => 'Lieutenant'
          (81..100)   => 'Captain'
          (101..150)  => 'Major'
          (151..200)  => 'Colonel'
          201         => 'General'
        }

我需要检查用户的点是否在哈希的范围键中,并提取必要的值。有什么优雅的解决方案吗?我可以使用“case”运算符,但这不会像我想要的那样优雅。

【问题讨论】:

    标签: ruby hash


    【解决方案1】:

    您可以迭代所有键/​​值对并检查。

    RANKS = { (1..20)     => 'Private',
              (21..40)    => 'Corporal',
              (41..60)    => 'Sergeant',
              (61..80)    => 'Lieutenant',
              (81..100)   => 'Captain',
              (101..150)  => 'Major',
              (151..200)  => 'Colonel',
              (201..+1.0/0.0)         => 'General', # from 201 to infinity
            }
    
    
    def get_rank score
      RANKS.each do |k, v|
        return v if k.include?(score)
      end
    
      nil
    end
    
    get_rank 1 # => "Private"
    get_rank 50 # => "Sergeant"
    get_rank 500 # => "General"
    get_rank -1 # => nil
    

    更新:

    我不知道你为什么认为case 不优雅。我认为它非常优雅。

    def get_rank score
      case score
      when (1..10) then 'Private'
      when (21..40) then 'Corporal'
      when (41..1.0/0.0) then 'Sergeant or higher'
      else nil
      end
    end
    
    get_rank 1 # => "Private"
    get_rank 50 # => "Sergeant or higher"
    get_rank 500 # => "Sergeant or higher"
    get_rank -1 # => nil
    

    【讨论】:

    • 太棒了。那是我一直在寻找的东西。非常感谢。
    • 我只是想分离逻辑。我想将映射的哈希存储在我进行所有计算的课堂之外的其他地方。您的解决方案完美运行。非常感谢,@SergioTulentsev
    • 不用担心。当你积累了一些代表时,你可以稍后再回来:)
    猜你喜欢
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多