Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

EnumerableのMix-Inのサンプル

概要

EnumerableのMix-Inのサンプル

詳細

EnumerableをMix-Inすることで、様々な繰り返し操作が可能です。
Enumerableモジュールは内部でeachを利用しているため、
eachを実装する必要があります。

サンプル仕様

複数の生徒を持つ先生クラスを想定

サンプルコード

# encoding: Windows-31J

require "pp"

class Teacher
  attr_accessor :students
  include Enumerable
  
  def each
    students.each {|student|yield student}
  end
end

teacher = Teacher.new
teacher.students = %w{tanaka suzuki sato}

# 生徒に田中さんがいるか確認=>true
puts teacher.any? {|student|student == "tanaka"}
# 生徒に林さんがいるか確認=>false
puts teacher.any? {|student|student == "hayashi"}
# 生徒をさん付けで収集=>["tanakaさん", "suzukiさん", "satoさん"]
pp teacher.collect {|student|"#{student}さん"}
# 生徒数を取得=>3
pp teacher.count
# 先頭がsはじまる生徒数を取得=>2
pp teacher.count {|student|student.slice(0,1) == "s"}
# 生徒をくん付けで3回ずつ呼ぶ=>"#{student}くん,"
teacher.cycle(3) {|student|print "#{student}くん,"}.to_s + "\n"

# 小林を探して発見出来なければメッセージを表示
ifnone = lambda {puts "\n小林がいないよ"}
puts teacher.find(ifnone) {|child|child == "kobayashi"}
# 1番目の要素を捨てて、以降の要素をリストで返す
print teacher.drop(1).to_s + "\n"
# 最初の生徒を表示する
puts "最初の生徒は#{teacher.first}"

出力

true
false
["tanakaさん", "suzukiさん", "satoさん"]
3
2
tanakaくん,suzukiくん,satoくん,tanakaくん,suzukiくん,satoくん,tanakaくん,suzukiくん,satoくん,
小林がいないよ

["suzuki", "sato"]
最初の生徒はtanaka