Когда я впервые познакомился с массивами в Ruby, я был потрясен открывшимися ими новыми возможностями и сценариями. Для тех из вас, кто может не знать, в терминах Ruby, массив - это объект, который может содержать индекс многих других объектов. Интересно то, что массив может содержать огромное количество информации (и, с точки зрения начинающего программиста, чем больше данных мы можем работать, тем лучше). Подавляющая, а иногда и устрашающая сторона этого - попытка получить доступ ко всем этим данным. Как мне вообще начать получать эту информацию?

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

classy_ladies = ["jane", "elizabeth", "mary", "kitty", "lydia"]
=> ["Jane", "Elizabeth", "Mary", "Kitty", "Lydia"]
classy_ladies.each {|lady| puts "Hi, I'm #{lady.capitalize}, and I'm classy."}
Hi, I'm Jane, and I'm classy.
Hi, I'm Elizabeth, and I'm classy.
Hi, I'm Mary, and I'm classy.
Hi, I'm Kitty, and I'm classy.
Hi, I'm Lydia, and I'm classy.
 => ["jane", "elizabeth", "mary", "kitty", "lydia"]

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

Из-за его простоты легко захотеть использовать #each для любых без исключения итераций. Это вполне может быть правдой с правильным количеством кода и ноу-хау. Это все равно что засунуть квадратный колышек в круглое отверстие. Это может потребовать много работы, и это может выглядеть некрасиво, но эй, это там!

По правде говоря, #each иногда может быть очень ограничивающим, особенно при попытке вернуть обновленные значения для управляемых элементов. Обратите внимание, что в нашем примере classy_ladies был возвращен исходный массив, а строки вернулись к нижнему регистру. Что, если бы я хотел сохранить это изменение?

«Если вам нужно настроить массив заполнителей перед оператором #each, вам, вероятно, не следует использовать #each». —Пол Николсон

Ниже я перечислил несколько перечислимых методов, которые оказались полезными при попытке доступа и / или манипулирования данными, размещенными в массиве:

#map (также известный как .collect. Оба метода выполняют одно и то же действие). Это вернет новый массив возвращаемых значений с каждой итерации:

classy_ladies.map {|lady| lady.capitalize}
 => ["Jane", "Elizabeth", "Mary", "Kitty", "Lydia"]

Несколько замечаний по поводу #map. Во-первых, он вернет новый массив обновленных значений, что означает, что, если они не сохранены в переменной, по существу теряются (способ изменить массив на месте - использовать оператор bang (!) Сразу после #map). Во-вторых, количество элементов, попадающих в #map, - это количество элементов, возвращаемых из #map. В-третьих, #map всегда будет возвращать массив возвращаемых значений с каждой итерации. Это означает, что если вы не хотите, чтобы массив был заполнен nil, true и / или false, вам, вероятно, следует оставить операторы put и if вне блока кода.

classy_ladies.map {|lady| lady.capitalize if lady == "jane"}
 => ["Jane", nil, nil, nil, nil] #Please don't do this

#select отлично подходит для (как вы уже догадались!) выбора элементов, соответствующих указанным условиям. Это полезно, если вы ожидаете, что многие элементы будут соответствовать одному и тому же условию. После добавления в группу новых девушек я хочу выбрать только девушек с длинными именами:

classy_ladies
 => ["jane", "elizabeth", "mary", "kitty", "lydia", "caroline", "georgiana", "charlotte"]
classy_ladies.select {|lady| lady.length > 5}
 => ["elizabeth", "caroline", "georgiana", "charlotte"]

#reject. Итак (оказывается, одна из моих недавно добавленных классных дам не такая уж классная… неловкая!) Вот когда я использую #reject.

classy_ladies.reject {|lady| lady == "caroline"}
 => ["jane", "elizabeth", "mary", "kitty", "lydia", "georgiana", "charlotte"]

Я начинаю понимать, что ничего не знаю об этих дамах, кроме того факта, что они классные. Мы должны это исправить.

classy_ladies.map! {|lady| lady.to_sym}
 => [:jane, :elizabeth, :mary, :kitty, :lydia, :georgiana, :charlotte]
fav_hobbies = ["reading outside", "walking", "not dancing", "giggling", "eloping", "playing piano"]

#zip сгруппирует элементы по индексу и объединит два массива в многомерный массив. Затем его можно превратить в хэш ключей и значений с помощью метода #to_h!

characters = classy_ladies.zip(fav_hobbies)
 => [[:jane, "reading outside"], [:elizabeth, "walking"], [:mary, "not dancing"], [:kitty, "giggling"], [:lydia, "eloping"], [:georgiana, "playing piano"], [:charlotte, nil]]
characters.to_h
 => {:jane=>"reading outside", :elizabeth=>"walking", :mary=>"not dancing", :kitty=>"giggling", :lydia=>"eloping", :georgiana=>"playing piano", :charlotte=>nil}

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