Я должен начать с того, что искал несколько крутых изображений, чтобы действительно проиллюстрировать свой пост. Если бы я мог показать некоторых кошек с игрушками, они определенно позволили бы мне объяснить .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}