Я должен начать с того, что искал несколько крутых изображений, чтобы действительно проиллюстрировать свой пост. Если бы я мог показать некоторых кошек с игрушками, они определенно позволили бы мне объяснить .each_with_object() это намного эффективнее. При этом я наткнулся на этот мем Кошки с невидимыми объектами. Определенно стоит погуглить.

Люди в моих классах разбрасывались .each_with_object() так, как будто они это понимают. Так что я подыгрывал. Но я этого не понимал.

collection_of_shit.each_with_object(the_object) {|shit, obj| code}

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

collection_of_shit

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

.each_with_object()

Это метод, который вы вызываете! Он действует на то, что стоит перед точкой, и передает в код то, что находится в скобках.

the_object

Объект. Это может быть, скажем, хэш.

{|shit, obj| code}

Это кодовый блок, который выполняет всю фактическую работу. Переменная shit представляет один элемент из collection_of_shit. Переменная obj представляет the_object. И код — это то место, где вы найдете код, который запускается для каждого элемента из коллекции. Одним из преимуществ этого метода является то, что возвращаемым значением является результирующий объект.

.each_with_object(), вероятно, полезен для многих вещей. Но кажется, что это особенно хорошо для создания новых коллекций класса Hash из массивов.

Пример.

У вас есть класс Donors, члены которого, очевидно, сделали пожертвования на какое-то достойное дело. Вам нужен хэш, в котором четко указаны доноры и суммы их пожертвований.

Donors.all = [arnold, william, martha, anaya]
Donors.all.each_with_object({}) do |donor, hash|
  hash[donor.name] = donor.gifts
end
=> {"Arnold" => 20, "William" => 20, "Martha" => 400, "Anaya" => 80}