Блог

Ruby:Хэши

Мое знакомство с Ruby.
Возможно кому-то пригодится, когда будет начинать его учить. Краткая информация о массивах.ХэшиХэш – это неупорядоченная коллекция пар “ключ-значение” {‘kye’=>’value’}. Хэш подобен массиву, вместо целочисленного индекса, индексирование производится по ключам. “Ключ-значение” не хранятся в том порядке, в котором они были вставлены или созданы, отличным от того, что вы вводили – содержимое здесь не упорядочивается, как в массиве.

Создание хэш
Пустой хэш можете создать с помощью метода new:

test = Hash.new

Проверить длину хэша можно, при помощи length или size:

test.length
test.size

Создать хэш со значением по умолчанию, которое в противном случае будет просто nil:

test = Hash.new( "test_key" )
test = Hash.new "test_key"

Если вы пытаетесь получить доступ с помощью несуществующего ключа у которого определенно значение по умолчанию, то вы получите значение по умолчанию:

test[0]        #=> "test_key"
test["FindKey"] #=> "test_key"

В классе Hash есть также метод [], который вызывает одним из способов или с разделяющей запятой.
Вариант 1

ha = Hash[:key1, 'value1', :key2, 'value2', :hz, 'next', :em, 'last value'] 
# => {:key2=>"value2", :hz=>"next", :em=>"last value", :key1=>"value2"}
puts ha[:key1] 
# => "value1"

Вариант 2

ha = Hash[:key1=>'value1', :key2=>'value2', :hz=>'next', :em=>'last value']
#=> {:key2=>"value2", :hz=>"next", :em=>"last value", :key1=>"value1"}

Вариант 3
Самый простой вариант создания хэша.

ha = {'key1'=>'value1', :key2=>'value2', 'hz'=>'next', 'em'=>'last value'}
#=> {:key2=>"value2", "hz"=>"next", "em"=>"last value", "key1"=>"value1"}

Получить доступ к хэшу

access = {'keys'=>'can', :get=>'value', 'use'=>'other', 'method'=>'ruby'}

Проверить имеется ли в хэше, можно следующими методами key?, has_key?, member? или include?

access.has_key? use
access.has_value? 'ruby'

has_value? – проверяет имеется ли заданное значение, можно так же использовать value?

При помощи keys вернет массив, всех ключех имеющиеся в хэше

access.keys

При помощи values вернет массив, всех значений имеющиеся в хэше

access.values

Извелечь из хэша можно одновременно одно или несколько значений при помощи values_at

access.keys 'keys'       #=> ["can"]
access.values_at 'keys', :get     #=> ["can", "value"]

Получить значение ключа (!только одного ключа) метод index

access.index 'ruby' #=> "method"

Метод select использует блок и возвращает новый, многомерный массив пар “ключ-значение”:

access.select { |key, val| val == 'ruby' }

Выполнение итераций
Итерации в хэше можно выполнять при помощи each, each_key, each_value или each_pair
– each – вызывает блок для каждого ключа:

access.each {|k,v| puts "#{k} = #{v}" }

Метод each может принимать один или для параметра, которые передаются блоку, как двухэлементные массивы. Метод each_pair подобен each, за исключением того, что он должен примать два параметра.

Метод each_key передает блоку только ключи:

access.each_key {|k| puts "#{k} " }

Метод each_value передает блоку все значения:

access.each_value {|val| puts "#{val} " }

Изменить хэш
Метод []= замещает или добавляет пары “ключ-значение”

access = {'keys'=>'value', 'value'=>'ruby'}
access['keys'] = 'Change value'
access['new_key'] = 'Value'

Объединяем хэши
Метод merge объединяет два хэша вместе, производя копию, из которой удаленны двойные ключи путем перезаписи пар ключ-значение.

a = {'keys'=>'can', :get=>'value', 'use'=>'other', 'method'=>'ruby'} 
#=> {"use"=>"other", "method"=>"ruby", "keys"=>"can", :get=>"value"}
b = {'need'=>'save', 'status'=>'ok', 'error'=>false} 
#=> {"status"=>"ok", "need"=>"save", "error"=>false}

a.merge b 
#=> {"status"=>"ok", "need"=>"save", "use"=>"other", "method"=>"ruby", "error"=>false, "keys"=>"can", :get=>"value"}

Можно улучшить отбор, применяя merge с блоком:

a = {'keys'=>'can', 'use'=>'other', 'method'=>'ruby'}
b = {'method'=>'merge', 'status'=>'ok', 'error'=>false}
a.merge(b) { |key, old, new| new = old+"_new"}
#=> {"status"=>"ok", "use"=>"other", "method"=>"ruby_new", "error"=>false, "keys"=>"can"}

Сортировка хэша
Если вы сортируете хэш методом sort, то получаете взамен многомерный массив двухэлементных массивов.

a.sort #=> [["keys", "can"], ["method", "ruby"], ["use", "other"]]

Удаление и очистка хэша
Удалить можно при помощи метода delete, метод использует ключ для поиска пары, а затем уничтожает ее.

a = {'keys'=>'can', 'use'=>'other', 'method'=>'ruby'}
a.delete 'use'

Можно использовать блок, если ключ не найден выполнится блок, и его значение возвращается методом delete

a.delete('keys') { | k | puts 'Not found::404' }

Метод delete_if также использует блок, он удаляет из хэша пары, для которых блок вычисляет значение true.

a.delete_if { | k, val | k=='keys' } 
#=> {"use"=>"other", "method"=>"ruby"}

Метод reject работает оналогично delete_if но возвращает копию хэша без указанной пары не меняя оригинал. reject! является эквивалентом delete_if.

Метод clear удаляет из хэша все пары, оставляя его пустым

a = {'keys'=>'can', 'use'=>'other', 'method'=>'ruby'}
a.clear   #=> {}
a.empty?  #=> true

Для того чтобы полостью заменить содержимое хэша, применяйте метод replace.

a = {'keys'=>'can', 'use'=>'other', 'method'=>'ruby'}
a.replace({'keys'=>'VALUE'})

Преобразовать хэш в другой класс
Можно преобразовать хэш в массив при помощи to_a.

a = {'key_1'=>'value_1', 'key_2'=>'value_2', 'key_3'=>'value_3'}
a.to_a 
#=> [["key_3", "value_3"], ["key_2", "value_2"], ["key_1", "value_1"]]

Можно преобразовать хэш в строку to_s.

a.to_s        
#=> "key_3value_3key_2value_2key_1value_1"

Можно преобразовать хэш в хэш to_hash.

Ссылки
http://ru.wikibooks.org/wiki/Ruby/Справочник/Array
http://ruby-doc.org/
http://www.ruby-lang.org/en/documentation/quickstart/
http://tryruby.org/levels/2/challenges/2
http://www.tutorialspoint.com/ruby/ruby_loops.htm

Книга:
Майкл Фитцджеральд – Изучаем Ruby: 2008