Рубин хеш прямой доступ против слияния - PullRequest
4 голосов
/ 16 мая 2011

Есть ли разница между:

@attr[:field] = new_value

и

@attr.merge(:field => new_value)

Ответы [ 3 ]

7 голосов
/ 16 мая 2011

Если вы используете merge! вместо merge, разницы нет.
Единственное отличие состоит в том, что вы можете использовать несколько полей (что означает: еще один хэш) в параметрах слияния.

Пример:

   h1 = { "a" => 100, "b" => 200 }
   h2 = { "b" => 254, "c" => 300 }
   h3 = h1.merge(h2)    
   puts h1         # => {"a" => 100, "b" => 200}
   puts h3         # => {"a"=>100, "b"=>254, "c"=>300}
   h1.merge!(h2)   
   puts h1         # => {"a"=>100, "b"=>254, "c"=>300}

При назначении отдельных значений я бы предпочел h[:field] = new_val вместо merge для удобства чтения, а я думаю, это быстрее, чем слияние.

Вы также можете взглянуть на Hash-rdoc: http://ruby -doc.org / core / classes / Hash.html # M000759

2 голосов
/ 02 августа 2011

Однако они делают то же самое:

@attr[:field] = new_value

более эффективен, поскольку обход хеша не требуется.

0 голосов
/ 02 августа 2011

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

В функциональном программировании на Ruby есть Не обновлять переменные

Не обновлять хэши

Нет:

hash = {:a => 1, :b => 2}
hash[:c] = 3
hash

Да:

hash = {:a => 1, :b => 2}
new_hash = hash.merge(:c => 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...