Rubyのモジュールとイントロスペクション
最初に解説する必要があるのは、Rubyにおけるアクセス制御だ。
Rubyのメソッドはpublic、protected、privateのいずれかを選択できる。publicなメソッド(これがデフォルトとなる)は、その名前から期待できる通りのアクセス可能性を提供するものの、Rubyのアクセス制御においてpublicメソッドのレシーバは明示的(特定クラスのインスタンスが格納された何らかの変数)、self(カレントオブジェクトを参照する擬似変数)、暗黙(レシーバを記述しない)のいずれかにすることができる。
なぜ暗黙のレシーバが必要になるのか理解できないという読者もおられるかもしれない。しかし暗黙のレシーバは、前回のコラムにおけるRubyのスクリプト例でもすでに登場していた。例えば次のように記述する場合でも暗黙のレシーバが用いられることになる。
puts 'some string'
#putsは暗黙のレシーバに対して起動されるメソッドとなっている。このことについては後ほど解説する。
protectedメソッドにはより厳しい制約が課されている−−protectedメソッドのレシーバは明示的であるか暗黙であるかにかかわらずselfと同じクラスでなければならない。
privateメソッドにはさらに厳しい制約が課されている−−privateメソッドのレシーバは暗黙のselfでなければならず、privateメソッドを起動する際に明示的にselfを指定することはできない。
アクセス可能性はここで解説した規則に準拠しているため、Javaのような他のオブジェクト指向言語とは異なり、その判定に継承が主な役割を演じることはない。ではいくつかの例を見てみることにしよう。
まずは手始めに、人の姓と名が格納されており、protectedメソッドとprivateメソッドを使用して完全な姓名を作り上げる単純なクラスを見てみることにしよう。
class Person
def first_name
'Steve'
end
def last_name
'Hayes'
end
protected
def full_name
built_name
end
private
def built_name
first_name + ' ' + last_name
end
end
protectedおよびprivateキーワードはどのような順序でも、また何度でも使用することができる。そして、これらのキーワードは他のアクセス修飾子が出現するまで有効となる。
これでPersonの新しいインスタンスを生成し、こういったメソッドそれぞれにアクセスしようとした時に何が起こるのかを見ることができるようになった。
person = Person.new person.first_name # => "Steve" person.last_name # => "Hayes" person.full_name # => protected method `full_name' called for #... person.built_name # => private method `built_name' called for #...
- ホワイトペーパー



