Хэш (Hash) в Ruby — это структура данных типа "ключ-значение", аналогичная словарям в других языках программирования. Хэши обеспечивают быстрый доступ к данным по уникальному ключу.
hash1 = {} # Пустой хэш
hash2 = Hash.new # Альтернативный синтаксис
hash3 = { "name" => "Alice", "age" => 30 } # Хэш с данными
hash4 = { name: "Alice", age: 30 } # Символьные ключи (Ruby 1.9+)
hash5 = Hash[:name, "Bob", :age, 25] # Создание из массива
hash = Hash.new(0) # При обращении к несуществующему ключу вернет 0
hash[:count] += 1 # => 1 (автоматическая инициализация)
person = { name: "Alice", age: 30 }
person[:name] # => "Alice" (доступ по ключу)
person.fetch(:age) # => 30 (с проверкой существования ключа)
person.keys # => [:name, :age] (массив ключей)
person.values # => ["Alice", 30] (массив значений)
person = {}
person[:name] = "Alice" # Добавление элемента
person[:age] = 30
person[:age] = 31 # Изменение значения
person.store(:city, "NY") # Альтернативный синтаксис
person = { name: "Alice", age: 30 }
person.delete(:age) # => 30 (удаляет и возвращает значение)
person.clear # Очищает весь хэш
{ a: 1, b: 2 }.each do |key, value|
puts "#{key}: #{value}"
end
# Вывод:
# a: 1
# b: 2
{ a: 1, b: 2 }.each_key { |k| puts k } # Только ключи
{ a: 1, b: 2 }.each_value { |v| puts v } # Только значения
h1 = { a: 1, b: 2 }
h2 = { b: 3, c: 4 }
h1.merge(h2) # => { a: 1, b: 3, c: 4 } (не изменяет h1)
h1.merge!(h2) # => { a: 1, b: 3, c: 4 } (изменяет h1)
{ a: 1 }.key?(:a) # => true
{ a: 1 }.value?(1) # => true
{ a: 1 }.empty? # => false
{ a: 1 }.size # => 1
{ a: 1, b: 2 }.transform_values { |v| v * 2 } # => { a: 2, b: 4 }
{ a: 1, b: 2 }.invert # => { 1 => :a, 2 => :b }
hash = { "name" => "Alice", :name => "Bob" }
hash["name"] # => "Alice"
hash[:name] # => "Bob"
{ "name" => "Alice" }.transform_keys(&:to_sym) # => { name: "Alice" }
users = {
alice: { age: 30, city: "NY" },
bob: { age: 25, city: "LA" }
}
users.dig(:alice, :age) # => 30 (безопасный доступ)
person = { name: "Alice", age: 30 }
name, age = person.values_at(:name, :age)
def greet(name:, age:)
"Hello, #{name}, age #{age}"
end
greet(name: "Alice", age: 30) # => "Hello, Alice, age 30"
h = { a: 1, b: 2 }
[:a, :b].map(&h) # => [1, 2]
fetch
когда важно наличие ключаHash.new
с блоком для сложных дефолтных значенийwords = %w[apple banana apple orange banana apple]
frequency = words.each_with_object(Hash.new(0)) { |w, h| h[w] += 1 }
# => {"apple"=>3, "banana"=>2, "orange"=>1}
config = {
database: {
adapter: "postgresql",
host: "localhost",
port: 5432
},
cache: {
enabled: true,
size: 1024
}
}
Резюмируем: хэши в Ruby — это мощная и гибкая структура данных, предоставляющая эффективные способы хранения и доступа к информации по ключам. Понимание работы хэшей, их методов и особенностей позволяет писать более чистый, выразительный и эффективный Ruby-код. Хэши широко применяются для конфигураций, передачи параметров, группировки данных и многих других задач.