если вы посмотрите, что делает .to_sym
, он преобразуется в символ. Я не эксперт, но :a
немного похож на литеральную строку с некоторыми отличиями, которые здесь не имеют значения.
irb(main):008:0> "a".to_sym
=> :a
irb(main):009:0>
Ты пишешь
"Переменная "хеш" включает ключи "цветы" и "синий"
Нет. В этом хэше есть только одна пара ключ-значение.
Код выполняет итерацию по хэшу, на первой и единственной итерации он устанавливает ключ в ":flowers"
hash[:flowers]="blah" создаст новый ключ в хеше с именем ":flowers" и значением "blah"
Но то, что делает этот код, находится справа, он делает hash.delete(key)
Давайте посмотрим, что делает hash.delete(key)
скажем, я делаю hash={:a=>5, :b=>2}, поэтому два ключа: a и :b, и вы видите значение, связанное с каждым ключом
irb(main):009:0> hash
=> {:a=>4, :b=>2}
irb(main):010:0> hash.delete(:a)
=> 4
irb(main):011:0> hash
=> {:b=>2}
irb(main):012:0>
Таким образом, hash.delete(key) удаляет пару ключ-значение для указанного ключа и возвращает значение удаленной пары ключей.
Таким образом, этот код в вашем вопросе (особенно если вы посмотрите на результат, который вы видите) приводит к переименованию всех ключей, в данном случае одного ключа, поскольку в хеше есть только один ключ, и сохраняет значение. Он делает это, создавая новые пары ключ-значение, а также удаляя исходные. Он получает значение исходного перед его удалением и создает новую пару ключ-значение.
И посмотреть больше на итерацию
Скажем, мы делаем это с этим хэшем... и я буду использовать более одной пары ключ-значение, так как легче понять хеш, когда есть несколько пар ключ-значение, поскольку хеш предназначен для хранения набора пар ключ-значение.
irb(main):026:0> hash
=> {"a"=>2, "b"=>4}
irb(main):027:0> hash.keys.each { |key| puts key }
a
b
=> ["a", "b"]
irb(main):028:0> hash.each { |i,j| puts i }
a
b
=> {"a"=>2, "b"=>4}
irb(main):029:0>
Так что да, hash.keys.each { |key ... }
будет перебирать все ключи
Если вы сделали |i,j| вы видите, что происходит.
Если вы делаете hash.each и просто |i|, то он перебирает все ключи и значения, ключ1 значение1 ключ2 значение2 и т.д.
irb(main):029:0> hash.each { |i| puts i }
a
2
b
4
=> {"a"=>2, "b"=>4}
irb(main):030:0>
Ты пишешь
Клавиши переключаются на символы
Вы должны использовать более технический термин, например, переименовать, но вам даже не нужно этого делать. Вы должны уметь мыслить кодом. hash[key.to_sym]= должно быть достаточно описательным. Он берет ключ, создает из него символ, а затем присваивает этому хешу новое значение[newkey]
и вставляется в хеш с помощью [] после того, как хеш переназначает свое значение, удаляя все предыдущие ключи с помощью метода .delete».
Нет. Если вы говорите a=b, то сначала оценивается b
, прежде чем оно будет присвоено a
.
В коде, который вы показываете, в правой части присваивания у вас есть удаление, поэтому удаление выполняется первым, и мы видим, что оно возвращает исходное значение, которое используется при создании новой пары ключ-значение.
person
barlop
schedule
03.07.2015
hash.each_key
. - person vgoff   schedule 04.07.2015