有人能够理解这段 Ruby 代码块的作用吗?

3

我曾在面试中遇到过这个问题,我猜测它是将传入的数据转换为本地语言,然后提交到数据库中?但显然这是错误的。

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
1个回答

3

看起来它只是递归地将嵌套哈希键转换为符号。

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

优化是一个不太合适的名称,应该使用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"}}

这种方法可以用来确保嵌套哈希具有正确的键。一些开发人员喜欢使用字符串键,而其他人则更喜欢符号:

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

服务器之间使用字符串进行通信,但Rails代码通常使用符号作为键。这就是为什么HashWithIndifferentAccess存在的原因之一。


对不起,我只是个初学者,您能解释一下这个在哪里会有用吗? - NickJames

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接