хеш как аргумент определения - PullRequest
1 голос
/ 23 апреля 2009

Возможно ли в любом случае следующее? Я продолжаю сталкиваться с нечетным списком номеров для Hash

def thores_hammer(bling)
  hammer_bling = { bling }
end

thores_hammer :rubys    => 5,
              :emeralds => 5,
              :souls    => 333

Спасибо заранее.

Ответы [ 3 ]

3 голосов
/ 23 апреля 2009

Причиной возникновения ошибки является то, что Hash создается неявно, когда метод thores_hammer вызывается - поэтому, когда вы делаете { bling }, вы создаете хеш только с одним ключом (который сам по себе является хешем) и без значения. Таким образом ошибка.

Все, что вам нужно сделать, это сбросить фигурные скобки:

irb> def thores_hammer(bling)
       hammer_bling = bling
     end
#=> nil
irb> thores_hammer :rubys    => 5,
                   :emeralds => 5,
                   :souls    => 333
#=> {:rubys=>5, :emeralds=>5, :souls=>333}
2 голосов
/ 23 апреля 2009

Что вы, возможно, намереваетесь сделать, это сделать копию хэша, которая может быть сделана как:

def thores_hammer(bling)
  hammer_bling = bling.dup
end

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

Кроме того, в Ruby есть несколько различных применений для фигурных скобок, таких как объявление блоков.

1 голос
/ 23 апреля 2009

Попробуйте это:

def thores_hammer(bling)
  hammer_bling = bling
end

thores_hammer Hash[:rubys => 5, :emeralds => 5, :souls => 333]
...