2012-01-16 8 views
5

ランダムなサイズのハッシュを持っています。"100"のような値があります。これは整数に変換したいものです。私はvalue.to_i if value.to_i.to_s == valueを使ってこれを行うことができると知っていますが、値が文字列か配列(ハッシュまたは文字列)、または別のハッシュのいずれかになることを考慮して、再帰的にハッシュを行う方法がわかりません。すべての数値文字列をRubyハッシュの整数に再帰的に変換します。

+0

郵便例 –

+0

また、あなたの質問に答える:?#is_kind_of 'で使用する再帰を' ' –

+0

obj.to_i.to_s == obj'奇妙に思えます。同じ整数値に対して異なる文字列表現が存在する可能性があります。 "1_000_000"または "019"。 –

答えて

10

これは非常に簡単な再帰的実装です(ただし、配列とハッシュの両方を処理する必要はありません)。

def fixnumify obj 
    if obj.respond_to? :to_i 
    # If we can cast it to a Fixnum, do it. 
    obj.to_i 

    elsif obj.is_a? Array 
    # If it's an Array, use Enumerable#map to recursively call this method 
    # on each item. 
    obj.map {|item| fixnumify item } 

    elsif obj.is_a? Hash 
    # If it's a Hash, recursively call this method on each value. 
    obj.merge(obj) {|k, val| fixnumify val } 

    else 
    # If for some reason we run into something else, just return 
    # it unmodified; alternatively you could throw an exception. 
    obj 

    end 
end 

そして、ちょっと、それも動作します:

hsh = { :a => '1', 
     :b => '2', 
     :c => { :d => '3', 
       :e => [ 4, '5', { :f => '6' } ] 
       }, 
     :g => 7, 
     :h => [], 
     :i => {} 
     } 

fixnumify hsh 
# => {:a=>1, :b=>2, :c=>{:d=>3, :e=>[4, 5, {:f=>6}]}, :g=>7, :h=>[], :i=>{}} 
+1

ありがとう、それは動作します。しかし、最初のifをif obj.respond_toに変更しなければなりませんでしたか? :to_iとobj.to_i.to_s == obj'という文字列を含むことができます。それに応じて回答を編集することができます。再度、感謝します! –

+2

'obj.merge(obj){| k、val | fixnumify val} '=>'ハッシュ[obj.map {| k、v | [k、fixnumify(val)] '?ちょうどそれがより速くすることができます卒業している。 –

+0

それは@VictorMorozかもしれませんが、私は徐々に推測するしかありません。私はいつもハッシュ[]を忘れています。ありがとう! –

0

は、これは私のヘルパークラスです。単なる数値(整数または浮動小数点数)の文字列を変換するだけです。

module Helpers 
    class Number 
    class << self 
     def convert(object) 
     case object 
     when String 
      begin 
      numeric(object) 
      rescue StandardError 
      object 
      end 
     when Array 
      object.map { |i| convert i } 
     when Hash 
      object.merge(object) { |_k, v| convert v } 
     else 
      object 
     end 
     end # convert 

     private 

     def numeric(object) 
     Integer(object) 
     rescue 
     Float(object) 
     end # numeric 
    end # << self 
    end # Number 
end # Helpers 

Helpers::Number.convert [{a: ["1", "22sd"]}, 2, ['1.3', {b: "c"}]] 
#=> [{:a=>[1, "22sd"]}, 2, [1.3, {:b=>"c"}]] 
関連する問題