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
class Salut
# attr_accessor :msg
def msg
@msg
end
def mgs=(val)
@msg = val
end
end
こんな感じです。
sa.msg = val と書くと sa.msg=(val) が実行されます。