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. 最後に、ハッシュをループして、ネストされたハッシュに別の名前空間を適用したいと思います。

    • 残念ながら、私はサボンジェムでこれを直接行うための良い解決策を見つけることができませんでした:

      soap.body = request_object.my_hash
      
    • 各要素を調べて、classifyメソッドでネストされたレベルを再帰的に見つけようとします:(これにはもう少し魔法が必要です)

      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は2つの名前空間です):

{'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 に答える