2013-06-12 5 views
0

Я делаю подкласс хэша, который я хочу, чтобы иметь возможность заполнить первоначально используя хэш, то есть:Ruby: Как заполнить подкласс Hash от Hash

class HashSub < Hash 
    def initialize(old_hash) 
    ... 
    end 
end 

a = HashSub.new({'akey' => 'avalue'}) 

puts a['akey'] 

>> avalue 

Так как Hash.new не принимает хэш, какой самый чистый способ достичь этого?

ответ

5

Чистейший, по моему опыту, это оставить инициализатору в покое и полагаться класс [] оператор:

>> class SubHash < Hash; end 
=> nil 

>> a = Hash[{:a => :b}] 
=> {:a=>:b} 

>> a.class 
=> Hash 

>> b = SubHash[{:a => :b}] 
=> {:a=>:b} 

>> b.class 
=> SubHash 
0
H = Class.new Hash 
a = {a: 2, b: 3} 
b = H[ a ] 
b.class #=> H 
1

Чтобы улучшить Дениса ответа, вы можете псевдоним метод класса [] до new.

class SubHash < Hash; end 
    singleton_class{alias :new :[]} 
end 

SubHash.new(a: :b).class # => SubHash