Может ли кто-нибудь сказать мне, что этот код делает бит за битом?

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

В настоящее время я читаю это как «Переменная« хэш »включает в себя ключ« цветы »и« синий »». «Каждый перебирает хэш и только его ключи с заполнителем «ключи». Ключи переключаются на символы и вставляются в хеш с помощью [] после того, как хэшу переназначается его значение путем удаления всех предыдущих ключей с помощью . метод удаления."

Я прав или я пропустил шаг? Я новичок в Ruby и ищу помощи.

 hash = {"flowers" => "blue"}

 hash.keys.each { |key| hash[key.to_sym] = hash.delete(key) }

 puts hash

person Erik Aasland    schedule 03.07.2015    source источник
comment
Просто к вашему сведению, у вас может быть небольшая сдача hash.each_key.   -  person vgoff    schedule 04.07.2015


Ответы (1)


если вы посмотрите, что делает .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