Skip to content

Instantly share code, notes, and snippets.

@F-3r
Last active December 16, 2015 07:38
Show Gist options
  • Save F-3r/5399735 to your computer and use it in GitHub Desktop.
Save F-3r/5399735 to your computer and use it in GitHub Desktop.
HashTree
class HashTree < Hash
def self.new
super { |h, k| h[k] = new(&h.default_proc) }
end
def path=(*nodes, value)
k = nodes.shift
if nodes.empty?
self[k] = value
else
self[k].path=(*nodes, value)
end
end
def path(*nodes)
k = nodes.shift
if nodes.empty?
self[k]
else
self[k].path(*nodes)
end
end
end
h = HashTree.new
h[:a][:b][:c]
=> {}
h
=> {a: {b:{ c: {}}}}
h[:a][:b][:c] = 1000
=> 1000
h[:a][:b][:c]
=> 1000
path = [:a,:b,:c]
=>[:a,:b,:c]
h.path(path)
=>1000
h.path=(path, 2)
=>2
h.path(path)
=>2
@patriciomacadden
Copy link

Lo choto de sobre-escribir new es que perdés un poco la interface que te propone Hash. Si bien son objetos diferentes, new debería (según creo) ser igual a la superclase.

Podrías hacer algo como:

def new(*)
  # lo que estas haciendo
end

por otro lado, no haría falta decir: HashTree.new(&h.default_proc), con new(&h.default_proc) bastaría, porque el receptor del mensaje es self, que es HashTree.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment