【问题标题】:How can I shrink and make a better use of this method? - RUBY (raw)我怎样才能缩小并更好地利用这种方法? - 红宝石(未加工)
【发布时间】:2016-06-14 21:51:56
【问题描述】:

Working on a project and trying to turn this method (I Have some more similar methods like that in my project) into a more dynamic and concise way

图像数据

def proficiency_parser(stored_data, name, race, year, title, percentage)
  if stored_data.has_key?(name)
    if stored_data[name].has_key?(race)
      if stored_data[name][race].has_key?(year)
        stored_data[name][race][year][title] = percentage
      else
        stored_data[name][race][year] = {title => percentage}
      end
    else
      stored_data[name][race] = {year => {title => percentage}}
    end
  else
    stored_data[name] = {race => {year => {title => percentage}}}
  end
end

所以基本上这种方法通过我的数据来识别它是否符合代码中显示的那些规范,基本上我只是不想尽可能使用这么多的“else”和“Ifs”。

数据

stored_data
# => {"COLORADO"=>{3=>{2008=>{:math=>0.697}}}}
name
# => "COLORADO"
race
# => 3
year
# => 2008
title
# => :math
percentage
# => 0.697

【问题讨论】:

  • 你能否描述一下这个方法应该做什么,以及你所说的“更好地利用”是什么意思?
  • 欢迎来到 Stack Overflow。请阅读“How to Ask”及其链接页面。请不要使用指向图像(或其他站点)的链接来获取对您的问题至关重要的信息;链接腐烂然后断开,使您的问题对于未来寻找类似解决方案的人毫无价值。

标签: ruby methods


【解决方案1】:

查看 Hash#dig,它包含在 Ruby 版本 2.3.0 或更高版本中。

总结一下:

hash_1 = { a: { a: { a: "b" } } }
hash_2 = { c: { c: { c: "d" } } }
hash_1.dig(:a, :a, :a) # returns "b"
hash_2.dig(:a, :a, :a) # returns nil

所以你可以说if hash_1.dig(:a, :a) 而不是

if hash_1[:a]
  if hash_1[:a][:a]
    # etc

还有另一种方法可以做到这一点,即挽救您的NoMethod [] 错误。

这是一个例子:

if hash_1[:a][:a][:a] rescue false
   puts "the key exists"
else
   puts "the key doesnt exist"
end

【讨论】:

    【解决方案2】:

    你可以使用一些递归调用

    输入数据

    stored_data = {}
    name = 'COLORADO'
    race = 3
    year = 2008
    title = :math
    percentage = 0.697
    

    方法

    def proficiency_parser(stored_data, name, race, year, title, percentage)
      parser(stored_data, name, {race => {year => {title => percentage}}})
    end
    
    def parser(data, key, value)
      data[key] ? value.each { |k, v| parser(data[key], k, v) } : data[key] = value
    end
    

    打电话

    proficiency_parser(stored_data, name, race, year, title, percentage)
    
    p stored_data
    # => {"COLORADO"=>{3=>{2008=>{:math=>0.697}}}}
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2020-01-03
      • 2012-04-23
      相关资源
      最近更新 更多