2009-09-26 72 views
2

我想扩展Hash类,以便所有散列在创建时得到相同的default_proc。所以我把这个在我的文件:使用default_proc初始化所有散列

class Hash 
    def initialize 
    self.default_proc = proc { |hash, key| raise NameError, "#{key} is not allowed" } 
    end 
end 

,如果我用这个语法

h = Hash.new 

这工作正常,但如果我用

h = {} 

摆弄它,似乎后者的语法不会调用initialize。是否有一种“铁皮”方式来实现为所有哈希设置default_proc

回答

0

是,{}不会调用initialize方法,因为你不能传递一个块{}

# This will issue an error 
h = {}{#some block code} 

但是你仍然可以通过块新的方法:

h = Hash.new { |hash, key| raise NameError, "#{key} is not allowed" } 
1

我想你可以拦截[]

class Hash 
    alias realGet [] 
    def [](x) 
    t = realGet(x) 
    if t == nil 
     puts 'intercepted' 
    end 
    t 
    end 
end 
+0

很酷!那是我从未想过的事情。好消息是,在我对红宝石感到厌倦之前,这将是一个难忘的时光。 ;) – user119282 2009-09-26 22:31:43