2009-09-26 99 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