Rubyのモジュールとイントロスペクション

文:Steve Hayes(Builder AU) 翻訳校正:村上雅章・野崎裕子
2007-12-13 10:00:00
  • このエントリーをはてなブックマークに追加

 最初に解説する必要があるのは、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 #...
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]