Skip to content

Instantly share code, notes, and snippets.

@psylone
Created March 3, 2016 11:55
Show Gist options
  • Save psylone/2002b1c9465654f50c70 to your computer and use it in GitHub Desktop.
Save psylone/2002b1c9465654f50c70 to your computer and use it in GitHub Desktop.
Ruby #inject method explanation
var = %w[Ruby Java Scala Go JavaScript Elixir]
on = var.inject(Hash.new){ |result, language| result[language] = language.length; result }
p on
# Пояснения
# Итак, метод #inject позволяет проводить итерацию и одновременно "накапливать" результат в переменной
# Начальное значение этой накапливающей переменной мы задаём в аргументе метода #inject
# В нашем случае это Hash.new
# Далее начинается итерация 1
# В блок в result попадает пустой хэш. В локальную переменную language попадает 1-й элемент массива, т.е. строка 'Ruby'
# Таким образом, имеем при первой итерации: result = {}; language = 'Ruby'
# Дальше в хэш помещается пара с ключом 'Ruby' и значением 4 (длина строки 'Ruby')
# Последние действие в блоке - мы возвращаем хэш result. ИМЕННО ПОСЛЕДНЕЕ ЗНАЧЕНИЕ В БЛОКЕ ВНОВЬ ПРИ СЛЕДУЮЩЕЙ ИТЕРАЦИИ ПОПАДАЕТ В ПЕРЕМЕННУЮ result
# Итерация 2
# result = {"Ruby"=>4}; language = 'Java'
# Порядок действий аналогичный: в хэш добавляем пару с ключом 'Java' и значением 4
# Затем этот хэш возвращаем из блока и он присваивается переменной result уже при следующей итерации
# Итерация 3
# result = {"Ruby"=>4, "Java"=>4}
# И так по всем элементам массива
# В результате возвращается хэш {"Ruby"=>4, "Java"=>4, "Scala"=>5, "Go"=>2, "JavaScript"=>10, "Elixir"=>6}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment