简体   繁体   English

任何人都可以弄清楚这块红宝石代码的作用是什么?

[英]Can anyone figure out what this block of ruby code does?

Had this as part of an interview,I guessed it took incoming data, translated it into local language then commits to database? 如果这是一次采访的一部分,我猜测它需要传入数据,将其翻译成本地语言然后提交到数据库? Which was obviously wrong. 这显然是错的。

def optimize(hsh)
  hsh.reduce({}) do |new_hsh, (k,v)|
    new_hsh[k.to_sym] = v.kind_of?(Hash) ? optimize(v) : v
    new_hsh
  end
end

It looks like it just recursively converts keys from nested hashes to symbols. 看起来它只是递归地将嵌套哈希中的键转换为符号。

optimize({'k' => {'l' => 'v'}})
#=> {:k=>{:l=>"v"}}

Optimize is a poor name and each_with_object should be used instead of reduce : Optimize是一个糟糕的名称,应该使用each_with_object而不是reduce

def symbolize_keys(hash)
  hash.each_with_object({}) do |(k, v), new_hash|
    new_hash[k.to_sym] = v.is_a?(Hash) ? symbolize_keys(v) : v
  end
end

puts symbolize_keys('k' => { 'l' => 'v' })
#=> {:k=>{:l=>"v"}}

This method could be used to make sure that a nested hash has the correct keys. 此方法可用于确保嵌套哈希具有正确的键。 Some devs like to use string keys, others prefer symbols : 有些开发人员喜欢使用字符串键,有些人喜欢使用符号:

{'a' => 'b'}[:a]
#=> nil
symbolize_keys({'a' => 'b'})[:a]
#=> 'b'

Servers talk to each others with strings but Rails code is often written with symbols as keys. 服务器通过字符串彼此交谈,但Rails代码通常用符号作为键来编写。 That's one of the reasons why HashWithIndifferentAccess exists. 这就是HashWithIndifferentAccess存在的原因之一。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM