2011-06-21 2 views
0

У меня есть «хэш-дерево», как это:Есть ли способ переместить «вверх» хэш-дерево в рубине?

dat = { 
    'building' => {'street' => 'High Street 10', 'people' =>[Person, Person]} 
} 

Человек может быть что угодно.

Итак, в моем коде я прямо обращаюсь к «зданию» так: dat['building'], теперь есть способ как-нибудь пойти, вверх по дереву, чтобы получить доступ к {'building' => {...}}, снова?

я в настоящее время есть функция, давайте мне получить доступ к любому из этих:

def info with_root = false 
     with_root ? dat : dat['building'] 
    end #info 

Это не выглядит преступно плохо (я думаю), но я надеюсь, что это красивый способ.

Спасибо!

+1

Не имеет отношения к этому вопросу, но '' people '=> [Person, Person] 'на самом деле представляет собой массив классов, а не массив экземпляров людей. Кроме того, вы можете рассмотреть возможность использования символов, а не строк в качестве ключей. –

+0

Я не вижу необходимости двигаться «вверх». У вас есть дескриптор верхнего уровня, переменная 'dat'. Из этого вы можете достичь любого «узла». –

+0

@ закрыть избирателей: немного ли сломанная английская часть того, почему вы голосуете, чтобы закрыть? –

ответ

2

Короткий ответ: нет.

Причина в этом.

Предположим, у вас есть:

addr = {'street' => 'High Street 10', 'people' =>[Person, Person]} 
dat1 = {'building' => addr} 
dat2 = {'zip'=>55117, 'electricBillID'=>11223344, 'address' => addr 

Что происходит, когда вы идете "вверх"? Вы добираетесь до dat1 или dat2?

Если вам действительно нужно это сделать - и это не очевидно, что вы делаете - вам нужно будет использовать более сложную структуру данных, которая включает ссылки на содержащие объекты - нечто вроде дерева (https://rubygems.org/gems/rubytree) или простая структура графика.

И, как уже упоминалось, если вы просто вешаете на корневой объект, вы всегда можете отсканировать свой путь назад по хэшу.

Смежные вопросы