Oto sprytny podstęp, aby umożliwić hash autovivification w Ruby (zaczerpnięte z aspektów):rubin hash autovivification (fasety)
# File lib/core/facets/hash/autonew.rb, line 19
def self.autonew(*args)
leet = lambda { |hsh, key| hsh[key] = new(&leet) }
new(*args,&leet)
end
Chociaż to działa (oczywiście), uważam, że to naprawdę frustrujące, że mogę” t wymyślić, jak ta dwulistnica robi to, co robi.
Leet jest umieszczany jako wartość domyślna. Tak więc wtedy uzyskanie dostępu do h['new_key']
w jakiś sposób podnosi go i tworzy 'new_key' => {}
Teraz oczekiwałbym, że powróci domyślny obiekt wartości, w przeciwieństwie do jego oceny. Oznacza to, że 'new_key' => {}
nie jest automatycznie tworzony. W jaki więc sposób leet zostaje wywołany? Zwłaszcza z dwoma parametrami?
Doskonała odpowiedź. – Pesto
Rzeczywiście tak jest. To, w szczególności, nauczy mnie, żebym nigdy więcej nie odwoływał się do RubyBook (pochodzi ze standardową dystrybucją okien ruby), ponieważ nie wspomniał o tym małym nieistotnym fakcie dotyczącym bloków i nowego. – artemave