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

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

概述我有以下代码,它采用哈希并将所有值转换为字符串. 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 我有以下代码,它采用哈希并将所有值转换为字符串.

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 @valuesend

所以给出以下哈希:

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

我得到了YAML输出

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

当我想要这个输出

--- :post:   :ID: '123'  :text: 'foobar'

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

如何获得所需的输出?

解决方法 stringify_values的一个更简单的实现可以是 – 假设它总是一个哈希.此函数使用由Active Support Core Extensions添加的 Hash#deep_merge方法 – 我们将哈希与自身合并,以便在块中我们检查每个值并在其上调用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}endclass Foo    def to_s        "I am Foo"    endendh = {  post: {    ID: 123,arr: [1,2,3],obj: { me: Foo.new}  }}puts YAML.dump (stringify_values h)#=> ---:post:  :ID: '123'  :arr: "[1,3]"  :text: foobar  :obj:    :me: I am Foo

不确定value是数组时的期望是什么,因为Array#to_s也会将数组作为字符串给出,无论是否合适,您可以稍微决定并调整解决方案.

总结

以上是内存溢出为你收集整理的ruby-on-rails – 处理嵌套哈希以将所有值转换为字符串全部内容,希望文章能够帮你解决ruby-on-rails – 处理嵌套哈希以将所有值转换为字符串所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1229260.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存