gpt4 book ai didi

ruby - 改进此递归函数以在 Ruby 中进行哈希遍历

转载 作者:数据小太阳 更新时间:2023-10-29 07:43:39 25 4
gpt4 key购买 nike

我已经编写了一个方法来将值的散列(必要时嵌套)转换为一个链,该链可以与 eval 一起使用以从对象动态返回值。

例如传递了类似 { :user => { :club => :title }} 的散列,它将返回“user.club.title”,然后我可以对其进行评估。 (这样做的目的是为 View 编写一个方法,通过传入对象和我想要显示的属性列表,可以让我快速转储对象的内容,例如:item_row(@user, :name, :email, { :club => :title })

这是我得到的。它有效,但我知道它可以改进。很想知道您会如何改进它。

# hash = { :user => { :club => :title }}
# we want to end up with user.club.title
def hash_to_eval_chain(hash)
raise "Hash cannot contain multiple key-value pairs unless they are nested" if hash.size > 1
hash.each_pair do |key, value|
chain = key.to_s + "."
if value.is_a? String or value.is_a? Symbol
chain += value.to_s
elsif value.is_a? Hash
chain += hash_to_eval_chain(value)
else
raise "Only strings, symbols, and hashes are allowed as values in the hash."
end
# returning from inside the each_pair block only makes sense because we only ever accept hashes
# with a single key-value pair
return chain
end
end

puts hash_to_eval_chain({ :club => :title }) # => club.title

puts hash_to_eval_chain({ :user => { :club => :title }}) # => user.club.title

puts hash_to_eval_chain({ :user => { :club => { :owners => :name }}}) # => user.club.owners.name

puts ({ :user => { :club => { :owners => :name }}}).to_s # => userclubownersname (close, but lacks the periods)

最佳答案

def hash_to_arr(h)
arr = []
while h.kind_of?(Hash)
# FIXME : check h.size ?
k = h.keys[0]
arr.push(k)
h = h[k]
end
arr.push h
end

puts hash_to_arr(:club).join('.') #=> "club"
puts hash_to_arr(:club => :title).join('.') #=> "club.title"
puts hash_to_arr(:user => {:club => :title}).join('.') #=> "user.club.title"
puts hash_to_arr(:user => {:club => {:owners => :name}}).join('.') #=> "user.club.owners.name"
  • 调用 .join('.') 获取字符串。
  • 不检查除 Hash 之外的其他类型,我希望它们在被 Array#join('.') 调用时能够很好地响应 #to_s。
  • 没有递归调用
  • 更短的代码

最大的变化是避免迭代,因为我们对 1 元素哈希感兴趣。顺便说一句,像 [:club, :title, :owners] 这样的数组可能更适合您的使用。

干杯,
津巴布韦

关于ruby - 改进此递归函数以在 Ruby 中进行哈希遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1986815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com