attr_readerとかの仕組み

Rubyネタです.

Rubyではクラスを

class Salut
  def initialize
    @msg="hello"
    @count=10
  end
end

sa = Salut.new

のように定義し,利用する.ちなみに@msg,@countはインスタンス変数.

で,このインスタンス変数に外部からアクセスしたいときには,通常はアクセッサを定義することになる.C#とかだとgetter/setter,JavaとかだとgetMsg()とかを定義する.

Rubyでも自分で定義すればいいんだが,ここはメタプログラミング.ここで,attr_readerメソッドが登場します.これはClassクラスのインスタンスメソッド.(RubyではクラスはClassクラスのインスタンス!)
このattr_reader(ほかにattr_writer,attr_accessorがある)は何をするかというと,引数で渡したインスタンス変数(正確にはそのシンボル)に対してアクセスを行うメソッドをそのクラスに追加してくれる.

最初のうちはいわゆる「おまじない」の一種と思ってたけど,実は結構簡単で,

class Salut
  attr_reader :msg
  def initialize  
  (略)
end

は,attr_reader :msgが実行されることによって

class Salut
  def msg()
    @msg
  end
  def initialize  
  (略)
end

と置き換えられるイメージでいいっぽい.

attr_accessorは読み書き両方を追加するので,

class Salut
  attr_accessor :msg
  def initialize  
  (略)
end

は,attr_accessor :msgが実行されることによって

class Salut
  def msg()
    @msg
  end
  def msg(val)
    @msg=val
  end
  def initialize  
  (略)
end

かと思ったけど,Rubyは関数の多重定義できたっけ?できなかったような.
じゃぁこんな感じになるのかな?

class Salut
  def msg(val=nil)
    if val!=nil
      @msg
    else
      @msg=val
    end
  end
  def initialize  
  (略)
end