Главная страница » Ruby » 20. Методы хешей
Хеши в Ruby имеют множество встроенных методов, которые позволяют эффективно работать с коллекциями данных в формате ключ-значение. В этом уроке мы рассмотрим важные методы хешей, которые помогут вам выполнять различные операции, такие как добавление, удаление, поиск и трансформация данных.
fetch
Метод fetch
возвращает значение по ключу. Если ключ отсутствует, он может возвращать значение по умолчанию или вызывать исключение.
Пример:
person = { "name" => "Alice", "age" => 30 }
# Использование fetch без значения по умолчанию
puts person.fetch("name") # => "Alice"
# Использование fetch с значением по умолчанию
puts person.fetch("city", "Unknown") # => "Unknown"
# Использование fetch с блоком, который возвращает значение по умолчанию
puts person.fetch("city") { |key| "No value for #{key}" } # => "No value for city"
has_key?
и key?
Методы has_key?
и key?
проверяют, существует ли ключ в хеше.
Пример:
person = { "name" => "Alice", "age" => 30 }
puts person.has_key?("name") # => true
puts person.key?("city") # => false
has_value?
и value?
Методы has_value?
и value?
проверяют, существует ли значение в хеше.
Пример:
person = { "name" => "Alice", "age" => 30 }
puts person.has_value?(30) # => true
puts person.value?("New York") # => false
each_pair
Метод each_pair
перебирает пары ключ-значение в хеше, вызывая блок для каждой пары.
Пример:
person = { "name" => "Alice", "age" => 30 }
person.each_pair do |key, value|
puts "#{key}: #{value}"
end
merge!
Метод merge!
объединяет два хеша, изменяя исходный хеш. Если ключи совпадают, значения из второго хеша заменяют значения из первого.
Пример:
person = { "name" => "Alice", "age" => 30 }
address = { "city" => "New York", "zip" => "10001" }
person.merge!(address)
puts person # => {"name"=>"Alice", "age"=>30, "city"=>"New York", "zip"=>"10001"}
delete_if
и reject!
Методы delete_if
и reject!
удаляют элементы, для которых блок возвращает true
. Разница между ними в том, что reject!
изменяет исходный хеш, а delete_if
возвращает новый хеш.
Пример:
person = { "name" => "Alice", "age" => 30, "city" => "New York" }
# Использование delete_if
new_person = person.delete_if { |key, value| value.is_a?(String) }
puts new_person # => {"age"=>30}
# Использование reject!
person = { "name" => "Alice", "age" => 30, "city" => "New York" }
person.reject! { |key, value| value.is_a?(String) }
puts person # => {"age"=>30}
transform_values
Метод transform_values
создает новый хеш, где каждое значение преобразовано с помощью блока.
Пример:
person = { "name" => "Alice", "age" => 30 }
transformed = person.transform_values { |value| value.to_s.upcase }
puts transformed # => {"name"=>"ALICE", "age"=>"30"}
select
и reject
Методы select
и reject
создают новый хеш, содержащий элементы, удовлетворяющие условию блока для select
и не удовлетворяющие для reject
.
Пример:
person = { "name" => "Alice", "age" => 30, "city" => "New York" }
# Использование select
selected = person.select { |key, value| value.is_a?(String) }
puts selected # => {"name"=>"Alice", "city"=>"New York"}
# Использование reject
rejected = person.reject { |key, value| value.is_a?(String) }
puts rejected # => {"age"=>30}
key
и value
Метод key
возвращает ключ для заданного значения. Метод value
возвращает значение для заданного ключа (аналогично fetch
).
Пример:
person = { "name" => "Alice", "age" => 30 }
puts person.key(30) # => "age"
puts person.value("name") # => "Alice" (Метод value аналогичен вызову person["name"])
fetch
с отсутствующим ключом без значения по умолчаниюЕсли ключ отсутствует и значение по умолчанию не указано, fetch
вызовет исключение KeyError
.
Пример ошибки:
person = { "name" => "Alice" }
# Вызовет исключение KeyError, так как ключ "age" не существует
puts person.fetch("age")
select
и reject
При неправильном использовании блоков в методах select
и reject
можно получить неожиданные результаты.
Пример ошибки:
person = { "name" => "Alice", "age" => 30 }
# Неправильное использование блока
selected = person.select { |key, value| key == "name" }
puts selected # => {"name"=>"Alice"}
# Правильное использование для проверки значений
selected = person.select { |key, value| value.is_a?(Integer) }
puts selected # => {"age"=>30}
Методы хешей в Ruby предоставляют мощные инструменты для работы с ассоциативными массивами. Знание и правильное использование этих методов позволяют эффективно управлять данными, извлекать и изменять их.
Напишите метод update_person_info
, который принимает хеш с информацией о человеке и обновляет его, добавляя или изменяя значение для ключа «email». Если ключ «email» отсутствует, он должен быть добавлен.
Напишите метод find_keys_with_value
, который принимает хеш и значение, и возвращает массив всех ключей, соответствующих этому значению.
Пример решения:
# Задание 1
def update_person_info(person, email)
person["email"] = email
end
person = { "name" => "Alice", "age" => 30 }
update_person_info(person, "alice@example.com")
puts person # => {"name"=>"Alice", "age"=>30, "email"=>"alice@example.com"}
# Задание 2
def find_keys_with_value(hash, value)
hash.select { |key, val| val == value }.keys
end
data = { "name" => "Alice", "age" => 30, "city" => "New York", "email" => "alice@example.com" }
keys_with_value = find_keys_with_value(data, "Alice")
puts keys_with_value # => ["name"]
Проверьте свою программу, чтобы убедиться, что она правильно выполняет все операции и обрабатывает возможные ошибки.
Наша цель и главная задача сделать качественное образование в вашем браузере
Телефон: +375 33 910-08-92
Email: info@codefor.tech
Адрес: г. Барановичи, ул. Пирогова, д. 7
© 2024 Все права защищены. CodeFor.