Logo
Книга для начинающих
ВходРегистрация
/
Программирование
/
Курс Ruby
/

Методы хешей

Ruby: Методы хешей

Как и у массивов, базовый метод обработки хешей это each (или алиас each_pair). Он принимает на вход блок, в который передаются и ключ, и значение:

data = {
  clojure: 'dynamic',
  go: 'static',
  kotlin: 'static'
}

data.each do |key, value|
  # логика
end

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

transform_values

Этот метод позволяет преобразовать значения, оставив ключи. На выходе получается новый хеш:

new_data = data.transform_values { |value| value.upcase }
# { clojure: "DYNAMIC", go: "STATIC", kotlin: "STATIC" }

С помощью этого метода можно даже поменять тип значений и сделать их, например, массивами. Точно такой же метод есть и для ключей: transform_keys.

slice

Слайс позволяет извлечь из хеша только его часть по указанным ключам:

data.slice(:clojure, :go)
# { clojure: "dynamic", go: "static" }

select

Для более сложных ситуаций подходит метод select — он действует как фильтр и извлекает из хеша его часть, которая соответствует нужным условиям:

data.select { |key, value| value == 'static' }
# { go: "static", kotlin: "static" }

empty?

key?

Иногда бывает полезно проверить хеш на пустоту, за это отвечает метод empty? и проверить в хеше наличие ключа - это метод key?:

data.empty? # false
data.clear # метод clear очищает хеш
data.empty? # true

data.key? :go # true

Важно понимать, что если мы в качестве ключа передадим строку 'go' методу key?, то метод вернет false.

merge

Метод merge позволяет объединить два хеша. Если в целевом хеше обнаружен дубликат, то он будет перезаписан:

with_ruby = data.merge(ruby:'dynamic')
puts whith_ruby 
# => { clojure: "dynamic", go: "static", kotlin: "static", ruby: "dynamic" }
new_hash = data.merge(go:'compiled')
puts new_hash
# => { clojure: "dynamic", go: "compiled", kotlin: "static", ruby: "dynamic" }

merge может принимать блок, который можно использовать например для устранения коллизий:

data = { password: '123456' }
new_data = { password: '123' }
data.merge(new_data) do |key, old_password, new_password| 
  new_password.length >= 6 ? new_password : old_password
end

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

Задание

Реализуйте функцию plainify, которая принимает на вход список песен сгруппированных по имени группы и возвращает плоский список песен, удобный для вывода на экран.

data = {
    'Queen' => [
      'Bohemian Rhapsody',
      "Don't Stop Me Now"
    ],
    'Metallica' => [
      'Nothing Else Matters'
    ],
    "Guns N' Roses" => [
      'Paradise City',
      'November Rain'
    ],
    'AC/DC' => [
      'Thunderstruck',
      'Back In Black',
      'Shoot to Thrill'
    ]
  }

result = plainify data

# [
#   { band: 'Queen', song: 'Bohemian Rhapsody' },
#   { band: 'Queen', song: "Don't Stop Me Now" },
#   { band: 'Metallica', song: 'Nothing Else Matters' },
#   { band: "Guns N' Roses", song: 'Paradise City' },
#   { band: "Guns N' Roses", song: 'November Rain' },
#   { band: 'AC/DC', song: 'Thunderstruck' },
#   { band: 'AC/DC', song: 'Back In Black' },
#   { band: 'AC/DC', song: 'Shoot to Thrill' }
# ]
Коммерческий опыт и Трудоустройство

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются
/
Программирование
/
Курс Ruby
/

Методы хешей

Ruby: Методы хешей

Как и у массивов, базовый метод обработки хешей это each (или алиас each_pair). Он принимает на вход блок, в который передаются и ключ, и значение:

data = {
  clojure: 'dynamic',
  go: 'static',
  kotlin: 'static'
}

data.each do |key, value|
  # логика
end

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

transform_values

Этот метод позволяет преобразовать значения, оставив ключи. На выходе получается новый хеш:

new_data = data.transform_values { |value| value.upcase }
# { clojure: "DYNAMIC", go: "STATIC", kotlin: "STATIC" }

С помощью этого метода можно даже поменять тип значений и сделать их, например, массивами. Точно такой же метод есть и для ключей: transform_keys.

slice

Слайс позволяет извлечь из хеша только его часть по указанным ключам:

data.slice(:clojure, :go)
# { clojure: "dynamic", go: "static" }

select

Для более сложных ситуаций подходит метод select — он действует как фильтр и извлекает из хеша его часть, которая соответствует нужным условиям:

data.select { |key, value| value == 'static' }
# { go: "static", kotlin: "static" }

empty?

key?

Иногда бывает полезно проверить хеш на пустоту, за это отвечает метод empty? и проверить в хеше наличие ключа - это метод key?:

data.empty? # false
data.clear # метод clear очищает хеш
data.empty? # true

data.key? :go # true

Важно понимать, что если мы в качестве ключа передадим строку 'go' методу key?, то метод вернет false.

merge

Метод merge позволяет объединить два хеша. Если в целевом хеше обнаружен дубликат, то он будет перезаписан:

with_ruby = data.merge(ruby:'dynamic')
puts whith_ruby 
# => { clojure: "dynamic", go: "static", kotlin: "static", ruby: "dynamic" }
new_hash = data.merge(go:'compiled')
puts new_hash
# => { clojure: "dynamic", go: "compiled", kotlin: "static", ruby: "dynamic" }

merge может принимать блок, который можно использовать например для устранения коллизий:

data = { password: '123456' }
new_data = { password: '123' }
data.merge(new_data) do |key, old_password, new_password| 
  new_password.length >= 6 ? new_password : old_password
end

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

Задание

Реализуйте функцию plainify, которая принимает на вход список песен сгруппированных по имени группы и возвращает плоский список песен, удобный для вывода на экран.

data = {
    'Queen' => [
      'Bohemian Rhapsody',
      "Don't Stop Me Now"
    ],
    'Metallica' => [
      'Nothing Else Matters'
    ],
    "Guns N' Roses" => [
      'Paradise City',
      'November Rain'
    ],
    'AC/DC' => [
      'Thunderstruck',
      'Back In Black',
      'Shoot to Thrill'
    ]
  }

result = plainify data

# [
#   { band: 'Queen', song: 'Bohemian Rhapsody' },
#   { band: 'Queen', song: "Don't Stop Me Now" },
#   { band: 'Metallica', song: 'Nothing Else Matters' },
#   { band: "Guns N' Roses", song: 'Paradise City' },
#   { band: "Guns N' Roses", song: 'November Rain' },
#   { band: 'AC/DC', song: 'Thunderstruck' },
#   { band: 'AC/DC', song: 'Back In Black' },
#   { band: 'AC/DC', song: 'Shoot to Thrill' }
# ]
Коммерческий опыт и Трудоустройство

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются
← ПредыдущийСледующий →
← ПредыдущийСледующий →
← ПредыдущийСледующий →

Ваше упражнение проверяется по этим тестам

# frozen_string_literal: true

require 'test_helper'
require_relative 'index'

describe 'function' do
  it 'should works' do
    data = {
      'Queen' => [
        'Bohemian Rhapsody',
        "Don't Stop Me Now"
      ],
      'Metallica' => [
        'Nothing Else Matters'
      ],
      "Guns N' Roses" => [
        'Paradise City',
        'November Rain'
      ],
      'AC/DC' => [
        'Thunderstruck',
        'Back In Black',
        'Shoot to Thrill'
      ]
    }
    expected = [
      { band: 'Queen', song: 'Bohemian Rhapsody' },
      { band: 'Queen', song: "Don't Stop Me Now" },
      { band: 'Metallica', song: 'Nothing Else Matters' },
      { band: "Guns N' Roses", song: 'Paradise City' },
      { band: "Guns N' Roses", song: 'November Rain' },
      { band: 'AC/DC', song: 'Thunderstruck' },
      { band: 'AC/DC', song: 'Back In Black' },
      { band: 'AC/DC', song: 'Shoot to Thrill' }
    ]

    assert { plainify(data) == expected }
  end
end
← ПредыдущийСледующий →

Решение учителя откроется через:

20:00

waiting_clock
← ПредыдущийСледующий →