色々なモジュール
Rubyには標準で定義されている便利なモジュールがたくさんある。このページではその中から3つをピックアップして紹介していく。
Singleton
一般的にシングルトンとは、プログラム内で意図的にインスタンスを一つだけ生成するように設計されたクラスやそのオブジェクトのことで、それぞれシングルトンクラスやシングルトンオブジェクトと呼ばれる。プログラム全体に共通の状態や処理を持たせたい時、プログラム全体で整合性のある情報を扱いたい時に使われる。
Enumerable
Enumerableはデータの集合を扱うためのメソッドが定義されたモジュールである。それらのメソッドの全てがeachメソッドを使って定義されているのでincludeするクラスにはeachメソッドが定義されていなければならない。逆に言えばeachメソッドが定義されていればEnumerableモジュールをincludeして集合を扱う便利なメソッドを使うことができる。
では、Enumerableモジュールを使って自作のスタック、MyStackクラスを作成してみよう。
# MyStack.rb
class MyStack
include Enumerable
def initialize()
@array = []
end
def each(&block)
@array.each(&block)
end
def push(value)
tmp = @array
tmp << value
end
def push!(value)
@array << value
end
def pop()
@array[-1]
end
def pop!()
@array.delete_at(-1)
end
end
stack = MyStack.new
stack.push!(1)
stack.push!(2)
stack.push!(3)
stack.push!(4)
stack.push!(5)
stack.each {|i|
p i
}
puts "\npow"
stack.map{|i| i * i}.each {|i|
p i
}
puts "\neven"
stack.select{|i| i % 2 == 0}.each {|i|
p i
}
実行結果
$ ruby MyStack.rb
1
2
3
4
5
pow
1
4
9
16
25
even
2
4
ArrayもEnumerableなので、配列全体を処理したい場合には目的にマッチしたメソッドがEnumerableに定義されていないかどうか探してみるのが綺麗なコードを書く近道かもしれない。
例えば、整数型の配列arrayの要素を全て足し合わせるのは次の一行で済む。
array.reduce(0, :+)
Comparable
Comparableは比較演算子<=,<,==,>,>=で比較できるようにするためのモジュールである。これらのメソッドは、メソッド<=>を使って実装されているので、Enumerableでのeachメソッドのようにincludeするクラスで<=>が実装されていれば使用することができる。
a.<=>(b)メソッドで期待されている戻り値は以下の通りである。
- a > b なら正の整数
- a = b なら0
- a < b なら負の整数
- aとbが比較できなければnil