1

我处于需要找出散列级别并为该级别中的所有元素应用名称空间的情况。

这是场景:

  1. 我有一个用我的数据填充的对象。

  2. 接下来我将对象转换为哈希。

    #convert Object to Hash
    def my_hash
      Hash[instance_variables.map { |var| [var[1..-1].to_sym, instance_variable_get(var)] }]
    end
    
  3. 最后,我想遍历哈希并将不同的命名空间应用于我的嵌套哈希。

    • 不幸的是,我无法直接使用 savon gem 找到一个好的解决方案:

      soap.body = request_object.my_hash
      
    • 我将检查每个元素并尝试以递归方式在分类方法中找到嵌套级别:(这需要更多魔法)

      def classify(o)
        case o
          when Hash
            #Need to refactor this to prefix :data NS for nested hash, overwriting the default :mes NS. 
            h = {}
            o.each {|k,v| h[k] = classify(v)}
            h                 
          else
            o.class
        end 
      end
      soap.body = classify(request_object.my_hash)
      

它应该看起来像这样,源哈希:

{:UserTicket=>'123',:ImpersonationUsername=>'dave',:TicketSettings=>{:ResourceId=>'abcd',:ClientIp=>'0',:Username=>'bobby'}}

输出(其中 mes 和 data 是两个命名空间):

{'mes:UserTicket'=>'123','mes:ImpersonationUsername'=>'dave','mes:TicketSettings'=>{'data:ResourceId'=>'abcd','data:ClientIp'=>'0','data:Username'=>'bobby'}}
4

1 回答 1

0

这是一种方法,您可以传入与每个嵌套级别关联的标识符列表:

def classify(o, with)
  case o
    when Hash
      h = {}
      o.each {|k,v| h[:"#{with[0]}:#{k}"] = classify(v, with[1, with.length])}
      h                 
    else
      o.class
  end 
end

hash = {:UserTicket=>'123',:ImpersonationUsername=>'dave',:TicketSettings=>{:ResourceId=>'abcd',:ClientIp=>'0',:Username=>'bobby'}}

classify(hash, [ :mes, :data ])
# => {"mes:UserTicket"=>String, "mes:ImpersonationUsername"=>String, "mes:TicketSettings"=>{"data:ResourceId"=>String, "data:ClientIp"=>String, "data:Username"=>String}}

如果您使用的是递归算法,您有机会修改您挖掘的每个级别的应用范围。

于 2011-08-05T19:40:42.773 回答