В Ruby вы можете сохранить точку на узле в га sh для последующей замены - PullRequest
0 голосов
/ 31 января 2020

Мне нужно собрать несколько массивных JSON полезных нагрузок, и я хочу избежать массивных двойных вложенных листьев. Я хотел бы сделать что-то вроде этого:

tree = {}
tree[0] = {}
tree[0][1] = "stub"

# now save this pointer for later
stub = &tree[0][1]

...

# now go get the leaf

leaf = {0 => ["a","b","c"}

# now without having to search the entire tree, just use the old stub pointer

stub = leaf

Можно ли это сделать в Ruby?

Спасибо за любую помощь, Кевин

1 Ответ

2 голосов
/ 01 февраля 2020

У нас нет указателей (по крайней мере, на уровне Ruby), но у нас есть ссылки. Таким образом, вы могли бы использовать реальный ха sh вместо вашей строки "stub":

tree = {}
tree[0] = {}
tree[0][1] = {}

, затем поставить sh эту ссылку в leaf:

leaf = tree[0][1]

и изменить содержимое leaf без назначения ничего нового для leaf:

leaf[0] = %w[a b c]

Это оставит вас с tree[0][1], равным {0 => ['a', 'b', 'c']} по желанию. Конечно, если вы скажете leaf = {0 => %w[a b c]}, тогда у вас будет новая ссылка, и вы разорвите соединение с tree[0][1].

Обычно это идет в другом направлении. Когда вам нужен новый лист, вы создаете его:

leaf = {0 => %w[a b c]}

и затем помещаете этот лист в дерево:

tree[0][1] = leaf
tree[0][6] = leaf # Possibly in multiple places

Тогда вы можете сказать leaf[11] = %w[x y z] и tree[0][1][11] и tree[0][6][11] также будет ['x', 'y', 'z'], потому что leaf, tree[0][1] и tree[0][6] будут относиться к одному и тому же базовому ха sh.

...