中の人です。
探したけどなかったから作りました。
#=scan
#多次元ハッシュのキーを配列で指定、先頭から順にハッシュを取得する
#配列が終わった時点で値を返す。
#該当するキーが無ければnil
#==params
#overwrap::false キーの途中でHash以外が返った場合はnilを返す。
# ::true キーの途中でHash以外が返った場合は値を返す。
module HashScan
def self.scan(hash_obj,keys=[],overwrap=false)
if keys==[]
hash_obj
elsif !(hash_obj.instance_of? Hash)
if overwrap
hash_obj
else
nil
end
elsif hash_obj.key?(keys.first)
key=keys.shift
scan(hash_obj[key],keys,overwrap)
else
nil
end
end
end
module HashScanInclude
def scan(keys=[],overwrap=false)
HashScan.scan(self,keys,overwrap)
end
end
class Hash
include HashScanInclude
end
h={"1"=>{:key=>{:key2=>{"2"=>'value'}}}}
h.scan(["1",:key,:key2])
=> {"2"=>"value"}
h.scan(["1",:key,:key2,"2","NONE"],true)
=> "value"
h.scan(["1",:key,:key2,"2","NONE"],false)
=> nil
0 件のコメント:
コメントを投稿