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

「attr_readerとかの仕組み」への1件のフィードバック

  1. class Salut
    # attr_accessor :msg
    def msg
    @msg
    end
    def mgs=(val)
    @msg = val
    end
    end
    こんな感じです。
    sa.msg = val と書くと sa.msg=(val) が実行されます。

    返信

コメントする