Rubyでオブジェクトの配列を特定の属性の配列に変換する
主にC#をやっている私はC#とRubyで若干感覚が違いました。
結論から言うとmap
を使います。
C#の感覚だとselect
を使いそうなのですが、select
だとうまくいきません。
sample.rb
class Person
attr_accessor :name, :sex
def initialize(name, sex)
@name = name
@sex = sex
end
end
people = [Person.new("John", "M"), Person.new("Kid", "F")]
p people
# => [#<Person:0x007f8cf58aacd0 @name="John", @sex="M">, #<Person:0x007f8cf58aac58 @name="Kid", @sex="F">]
p people.map { |person| person.name }
# => ["John", "Kid"]
p people.map { |person| person.sex }
# => ["M", "F"]
p people.select { |person| person.sex }
# peopleがそのまま返されてしまう(Rubyのselectはブロックの戻り値が真になる要素を集めて返すメソッド)
# => [#<Person:0x007f8cf58aacd0 @name="John", @sex="M">, #<Person:0x007f8cf58aac58 @name="Kid", @sex="F">]