parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Да, так работает, хотя и походит на магию :)

andylars 06.06.2016 14:18 / 06.06.2016 14:21

Позвольте, продублирую последовательно всю механику из примера.

Итак:
# например, это хеш $h
0: KeyA:ValueA
1: KeyB:ValueB
2: KeyC:ValueC

Я хочу заменить имя ключа KeyB на KeyD - с сохранением индексов хеша.
Подставим значения в приведенный код:

^h.insert(^h.index_of[KeyB])[$.KeyD[$h.KeyB];$.force(true)]

Процесс:
# stage I: новый ключ-значение вставляется перед index_of[KeyB] = 1
0: KeyA:ValueA
--> KeyD.ValueB
1: KeyB:ValueB
2: KeyC:ValueC

# stage II: упорядочивание индексов с учетом нового элемента
0: KeyA:ValueA
1: KeyD:ValueB  
2: KeyB:ValueB
3: KeyC:ValueC

# stage III: удаление "старого" ключа
^h.delete[KeyB]

0: KeyA:ValueA
1: KeyD:ValueB  
del -> KeyB:ValueB
3: KeyC:ValueC

# stage IV: перестройка индексов
0: KeyA:ValueA
1: KeyD:ValueB  
2: KeyC:ValueC

# Результат: 
0: KeyA:ValueA -> 0: KeyA:ValueA
1: KeyB:ValueB -> 1: KeyD:ValueB
2: KeyC:ValueC -> 2: KeyC:ValueC
"Магически" - работает!

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

P.S.: slice - это нужно, но боялся заикаться в этом треде (чтобы не мешать в кучу все вопросы).