Elementor Header #8

19. Хеши

1. Введение

Хеши (или ассоциативные массивы) в Ruby — это коллекции пар ключ-значение. Они позволяют хранить и извлекать данные по ключу, что делает их удобными для представления данных с явной ассоциацией. Хеши являются важной частью Ruby и широко используются для хранения структурированных данных.

2. Создание хешей

Хеши можно создавать несколькими способами.

2.1. Использование литерала хеша

				
					# Создание хеша с использованием литерала
person = {
  "name" => "Alice",
  "age" => 30,
  "city" => "New York"
}

				
			

2.2. Использование метода Hash.new

				
					# Создание пустого хеша
empty_hash = Hash.new

# Создание хеша с дефолтным значением
default_hash = Hash.new("default_value")

				
			

3. Доступ к элементам хеша

К элементам хеша можно получить доступ с помощью ключей.

Пример:

				
					person = {
  "name" => "Alice",
  "age" => 30,
  "city" => "New York"
}

puts person["name"]  # => "Alice"
puts person["age"]   # => 30

				
			

4. Изменение хеша

Элементы хеша можно добавлять, изменять или удалять.

4.1. Добавление и изменение элементов

				
					person = {
  "name" => "Alice",
  "age" => 30
}

# Добавление нового элемента
person["city"] = "New York"

# Изменение существующего элемента
person["age"] = 31

puts person  # => {"name"=>"Alice", "age"=>31, "city"=>"New York"}

				
			

4.2. Удаление элементов

				
					person = {
  "name" => "Alice",
  "age" => 30,
  "city" => "New York"
}

# Удаление элемента
person.delete("age")

puts person  # => {"name"=>"Alice", "city"=>"New York"}

				
			

5. Методы для работы с хешами

5.1. keys и values

Методы keys и values возвращают массивы всех ключей и значений соответственно.

Пример:

				
					person = {
  "name" => "Alice",
  "age" => 30,
  "city" => "New York"
}

puts person.keys.inspect  # => ["name", "age", "city"]
puts person.values.inspect  # => ["Alice", 30, "New York"]

				
			

5.2. each

Метод each перебирает пары ключ-значение в хеше.

Пример:

				
					person = {
  "name" => "Alice",
  "age" => 30,
  "city" => "New York"
}

person.each do |key, value|
  puts "#{key}: #{value}"
end

				
			

5.3. select

Метод select возвращает новый хеш, содержащий элементы, для которых блок возвращает true.

Пример:

				
					person = {
  "name" => "Alice",
  "age" => 30,
  "city" => "New York"
}

selected = person.select { |key, value| value.is_a?(String) }
puts selected  # => {"name"=>"Alice", "city"=>"New York"}

				
			

5.4. merge

Метод merge объединяет два хеша, возвращая новый хеш.

Пример:

				
					person = {
  "name" => "Alice",
  "age" => 30
}

address = {
  "city" => "New York",
  "zip" => "10001"
}

merged = person.merge(address)
puts merged  # => {"name"=>"Alice", "age"=>30, "city"=>"New York", "zip"=>"10001"}

				
			

5.5. default

Метод default возвращает значение, возвращаемое по умолчанию для ключей, которые не существуют в хеше.

Пример:

				
					default_hash = Hash.new("default_value")

puts default_hash["non_existent_key"]  # => "default_value"

				
			

6. Распространённые ошибки

6.1. Ошибка: Неправильное использование ключей

Если вы используете неверный ключ для доступа к значению, вы получите nil.

Пример ошибки:

				
					person = {
  "name" => "Alice"
}

puts person["age"]  # => nil (ключ "age" не существует)

				
			

6.2. Ошибка: Неправильное изменение хеша

Когда вы пытаетесь изменить значение по ключу, который не существует, ключ будет добавлен с новым значением.

Пример ошибки:

				
					person = {
  "name" => "Alice"
}

person["age"] = 30
puts person  # => {"name"=>"Alice", "age"=>30}

				
			

Заключение

Хеши в Ruby — это мощный инструмент для хранения и управления данными в формате ключ-значение. Понимание их методов и особенностей позволяет эффективно работать с данными и создавать гибкие структуры данных.

7. Тестовое задание

  1. Создайте хеш, представляющий книгу с такими ключами, как «title», «author» и «year». Напишите метод, который принимает этот хеш и возвращает строку с полным описанием книги.

  2. Напишите метод filter_keys, который принимает хеш и возвращает новый хеш, содержащий только те элементы, у которых ключи начинаются с заданного префикса.

Пример решения:

				
					# Задание 1
def book_description(book)
  "#{book['title']} by #{book['author']}, published in #{book['year']}"
end

book = {
  "title" => "The Great Gatsby",
  "author" => "F. Scott Fitzgerald",
  "year" => 1925
}

puts book_description(book)  # => "The Great Gatsby by F. Scott Fitzgerald, published in 1925"

# Задание 2
def filter_keys(hash, prefix)
  hash.select { |key, _| key.start_with?(prefix) }
end

data = {
  "name" => "Alice",
  "name_first" => "Alice",
  "age" => 30,
  "city" => "New York"
}

filtered = filter_keys(data, "name")
puts filtered  # => {"name"=>"Alice", "name_first"=>"Alice"}

				
			

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

logo