2015-08-25 2 views
-1

Я видел сценарий рубин, который определяет массив хэшей, как это:Создание хэша со строками или символами, как ключи

boxes = [ 
    { :name => "playground", :ip => "19" }, 
    { :name => "elkstack",  :ip => "22" }, 
    { :name => "audit",   :ip => "23" } 
] 

Я не совсем уверен, что это правильный способ определить хэшей. Я думал, вы бы лучше определить этот массив хэшей, как это:

boxes = [ 
    { "name" => "playground", "ip" => "19" }, 
    { "name" => "elkstack",  "ip" => "22" }, 
    { "name" => "audit",   "ip" => "23" } 
] 

Не могли бы вы сказать, какой из них правильный способ определить хэши? Есть ли у вас побочные эффекты, которые вы, возможно, захотите избежать или спровоцировать, чтобы определить эти хэш-элементы как символы?

+1

Ключ для рубинового хеша может быть любого типа. – grenierm5

ответ

2

Оба способа правильные. В первом случае хэш-ключ будет символом, во втором случае они будут строками.

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

Фактически, есть даже ярлык для него.

boxes = [ 
    { name: "playground", ip: "19" }, 
    { name: "elkstack",  ip: "22" }, 
    { name: "audit",   ip: "23" } 
] 
+2

В настоящее время это не корректно с замороженными/деблокированными строками. А также, начиная с 2.1, существует только одно имя '' и один '' ip ''([demo] (https://eval.in/private/8829e56cd45bc8)). – cremno

+0

Вам все равно придется вручную замораживать строки вручную. –

+0

поэтому с дедуплированными строками проблема памяти при использовании нескольких строк одного и того же значения больше не должна быть проблемой. Разве это не недостаток в использовании символов? Я читал, что символы, которые не были созданы динамически, не будут собирать мусор. Не будет ли символьный подход утечкой памяти? – wullxz

Смежные вопросы