2022年9月15日木曜日

Rubyでコレクションを管理するクラスはEnumerableをincludeすると簡単

Rubyでコレクションを管理するクラスはEnumerableをincludeすると簡単

概要

RubyでArrayやHashを管理するクラスを定義する場合にはEnumerableモジュールをincludeしたクラスを作ると each などの見慣れたメソッドを独自のコレクションクラスで簡単に使うことができるようになります

他の情報を見るとEnumerableは使わないほうが良いという記事もあるのでご利用は自己責任でお願いします

環境

  • Ruby 3.1.2

サンプルコード

ポイントは each メソッドをオーバライドする点です

  • vim app.rb
class Users
  include Enumerable

  def initialize(users)
    @users = users
  end

  def each
    @users.each do |user|
      yield(user) if block_given?
    end
  end

  def names
    @users.map{|user|user.name}
  end
end

class User
  attr_reader :name, :age

  def initialize(name:, age:)
    @name = name
    @age = age
  end
end

users = Users.new(
  [
    User.new(name: "hawk", age: 10),
    User.new(name: "snowlog", age: 20),
    User.new(name: "taro", age: 30),
  ]
)
p users.names

動作確認

  • ruby app.rb
["hawk", "snowlog", "taro"]

0 件のコメント:

コメントを投稿