【发布时间】:2010-07-03 17:59:14
【问题描述】:
为了实现 Ruby 哈希的自动生存,可以使用以下类
class AutoHash < Hash
def initialize(*args)
super()
@update, @update_index = args[0][:update], args[0][:update_key] unless
args.empty?
end
def [](k)
if self.has_key?k
super(k)
else
AutoHash.new(:update => self, :update_key => k)
end
end
def []=(k, v)
@update[@update_index] = self if @update and @update_index
super
end
def few(n=0)
Array.new(n) { AutoHash.new }
end
end
这个类允许做以下事情
a = AutoHash.new
a[:a][:b] = 1
p a[:c] # => {} # key :c has not been created
p a # => {:a=>{:b=>1}} # note, that it does not have key :c
a,b,c = AutoHash.new.few 3
b[:d] = 1
p [a,b,c] # => [{}, {:d=>1}, {}] # hashes are independent
这个类有a bit more advanced definitionproposed by Joshua,有点看不懂。
问题
有一种情况,我认为新职业可以改进。以下代码失败并显示错误消息NoMethodError: undefined method '+' for {}:AutoHash
a = AutoHash.new
5.times { a[:sum] += 10 }
你会怎么处理它?可以定义[]+= 运算符吗?
相关问题
【问题讨论】:
-
你想用最后一段代码做什么,你想发生什么?如果您希望
a[:sum]为50,则必须在5.times行之前将其初始化为零,因为AutoHash无法知道您要在其中存储数字。
标签: ruby hash operator-keyword autovivification