Как перейти к массиву без явного объявления?

#ruby #arrays

#ruby #массивы

Вопрос:

У меня есть массив пользовательских объектов приложения Rails (пользователей), и я собираю записи электронной почты из этих объектов в новый массив. Я устал от этого:

 emails = []
users.each {|user| emails << user.email}
 

Есть ли способ объявить и использовать массив за один раз в таком блоке перечислителя?

Комментарии:

1. Теперь, когда мой Rails-fu набрал силу, я знаю, что для этого нужно использовать pluck . Например, User.where(<some_condition>).pluck(:email)

Ответ №1:

Используйте #collect метод

 users.collect {|user| user.email }
# in short
users.collect(amp;:email)
 

собирать электронные письма будет приятно читать, а не сопоставлять электронные письма, поэтому я буду использовать #collect . Но оба метода являются синонимами друг друга.

Комментарии:

1. Array конечно, имеет этот метод и действует так же, но users может и не быть Array . Что это такое, это Enumerable : ruby-doc.org/core-2.1.2/Enumerable.html#method-i-collect

2. @D-side Спасибо… Нет аргумента 🙂

Ответ №2:

Есть #each_with_object метод.

 users.each_with_object( [] ) {|user, emails| emails << user.email}
 

Не очень хороший пример, collect здесь он работает намного лучше, так как вам нужен массив. Однако, если вам когда-нибудь случится использовать другой контейнер, а не массив (возможно, какой-то пользовательский класс), это может быть удобно.

И я также должен отметить, что это очень похоже ActiveRecord на использование, поскольку речь идет о Rails. Так что вы можете счесть #pluck полезным:

Я не могу предоставить здесь равный фрагмент кода, потому что я понятия не имею, что у вас есть users . Но вот похожий фрагмент:

 User.all.pluck(:email)