Если вы можете реализовать метод each
для своего класса, тогда include Enumerable
, вы унаследуете все виды магического совершенства, включая map
.
Реализуйте <=>
, и вы получите еще больше.
Перечислимый ваш друг.
EDIT:
Если вы посмотрите, что происходит, когда вызывается Hash#map
, хеш преобразуется в массив массивов:
>> hash = {'a' => 1, 'b' => 2} #=> {"a"=>1, "b"=>2}
>> hash.map{|n| n} #=> [["a", 1], ["b", 2]]
После этого разработчик может зачистить и при необходимости перестроить преобразованный хеш. Это просто из-за того, как работает Hash[]
.
>> Hash[*hash.map{|n| n}.flatten] #=> {"a"=>1, "b"=>2}
Если бы это был я, я бы написал способ взять массив массивов и перестроить ваше дерево. Таким образом, ваш метод each
позволит вам include Enumerable
, что создаст map
. Вы можете назвать это, а затем восстановить дерево на лету. Посмотрите, как используется Hash#[]
, и вы должны приступить к реализации чего-то похожего для вашего кода.