gpt4 book ai didi

ruby-on-rails - 处理嵌套哈希以将所有值转换为字符串

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

我有以下代码,它采用散列并将所有转换为字符串。

def stringify_values obj
@values ||= obj.clone

obj.each do |k, v|
if v.is_a?(Hash)
@values[k] = stringify_values(v)
else
@values[k] = v.to_s
end
end

return @values
end

所以给定以下散列:

{
post: {
id: 123,
text: 'foobar',
}
}

我得到以下 YAML 输出

--- &1
:post: *1
:id: '123'
:text: 'foobar'

当我想要这个输出时

--- 
:post:
:id: '123'
:text: 'foobar'

看起来该对象已被展平,然后被赋予了对自身的引用,这导致我的规范中出现堆栈级错误。

如何获得所需的输出?

最佳答案

stringify_values 的一个更简单的实现可以是——假设它总是一个哈希。此函数使用 Hash#deep_merge Active Support Core Extensions 添加的方法 - 我们将散列与其自身合并,以便在 block 中检查每个值并对其调用 to_s

def stringify_values obj
obj.deep_merge(obj) {|_,_,v| v.to_s}
end

完整的工作示例:

require "yaml"
require "active_support/core_ext/hash"

def stringify_values obj
obj.deep_merge(obj) {|_,_,v| v.to_s}
end

class Foo
def to_s
"I am Foo"
end
end

h = {
post: {
id: 123,
arr: [1,2,3],
text: 'foobar',
obj: { me: Foo.new}
}
}

puts YAML.dump (stringify_values h)
#=>
---
:post:
:id: '123'
:arr: "[1, 2, 3]"
:text: foobar
:obj:
:me: I am Foo

不确定值是数组时的期望是什么,因为 Array#to_s 也会将数组作为字符串提供给您,无论是否需要,您都可以决定并调整解决方案有一点。

关于ruby-on-rails - 处理嵌套哈希以将所有值转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34595142/

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