Ruby меняет значение в хеше по ссылке - PullRequest
2 голосов
/ 03 марта 2012

Я использую eval для работы с хешем.Эта часть работает:

some_hash = {"a" => {"b" => "c"}}
target_hash = "some_hash"
target_key = "['a']"

my_value = eval(target_hash + target_key)
puts "my_value " + my_value.to_s

и печатает:

my_value {"b"=>"c"}

Как бы я изменил значение, используя eval, чтобы хеш получился так:1009 * Спасибо

Редактировать:

Не думаю, что я правильно объясняю.Мне нужно углубиться в хеш, но я хочу гибкость, чтобы сделать это со строкой, которая устанавливается во время выполнения.Эта строка может быть "['key_level_1']['key_level_2']['key_level_3']", которая должна относиться к some_hash['key_level_1']['key_level_2']['key_level_3'].

И снова мне нужно установить это значение на что-то.Имеет ли это смысл?

Ответы [ 4 ]

1 голос
/ 13 марта 2012

Вы можете использовать Hash#replace

def changeHash(a, b, targetHash, targetKey)
  change = ".replace({'#{a}' => '#{b}'})"
  my_value = eval(target_hash + target_key + change)
end

some_hash = {"a" => {"b" => "c"}}
target_key = "['a']"
changeHash('d', 'e', 'some_hash', '["a"]')
1 голос
/ 03 марта 2012

Я бы взял массив, например, ['key1', 'key2', 'key3'] (который может быть создан из строки с соответствующим форматированием) и «корневой объект», и использовал бы его для нахождения конкретной ветви «целевой объект» (я бы рекомендовал рекурсию).Затем манипулируйте соответствующим объектом, который был найден.В этом случае some_hash должен быть «корневым объектом» для запуска обхода, а не строкой.

Вот ссылка на действительно старый ответ, который я написал (когда ядо сих пор активно используется рубин).Он не обрабатывает бит присваивания, но я полагаю, что он показывает начало действительного подхода, который не имеет оценки: Как получить доступ к вложенным элементам хеша с помощью одного строкового ключа? После "целевой объект ", то это просто вопрос присвоения нового значения определенному ключу.(Принятый ответ в связанном посте также является жемчужиной, если не более загадочным и символизирующим.)

Удачное кодирование.

0 голосов
/ 13 марта 2012

Спасибо всем, за помощь.Я немного изменил это.Вместо того, чтобы передавать строку как массив, я просто передаю объект как этот:

{some_hash => {"a" => {"b" => "nil"}}}

Затем я рекурсивно пересекаю и ссылку, и реальный хеш.Когда я обнаруживаю nil в ссылке, я знаю, что я там.

0 голосов
/ 03 марта 2012

Я предлагаю настроить метод, подобный этому:

def hash_change(target_hash,target_key,*new_value)
     if new_value
          target_hash["target_key"] = new_value
     end
     puts "my_value " + target_hash["target_key"]
end

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

Редактировать: извините забыл звонок по методу

hash_change(some_hash,"a",{"d" => "e"})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...