というわけでゲッター、セッターについて書いてみます。
ゲッター
ゲッターとは・・・インスタンス変数の値を取得するためのメソッド
うーむ。意味わかりません。
例えば以下のクラスから@nameの値をprintしたいとして、
class Foo
def initialize
@name = 'taro'
end
end
foo = Foo.new
p foo
=>#<Foo:0x007fc9321b28c8 @name="taro">
これ以上どうやればいいのか、、こんなやり方もしてみたが
class Foo
def initialize(name)
@name = name
end
end
foo = Foo.new('taro')
foo.name
=>`<main>': undefined method `name' for #<Foo:0x007fdb330fa800 @name="taro"> (NoMethodError)
そりゃまぁそうだわなって感じですね。。上のコードで@nameを取り出したいのであれば、
class Foo
def initialize(name)
@name = name
end
def name
p @name
end
end
foo = Foo.new('taro')
foo.name
=> "taro"
のように一度メソッドで取り出してあげないといけない。
ちなみにこれはいける。
class Foo
def hoge(name)
@name = name
end
end
foo = Foo.new
p foo.hoge('taro')
=> "taro"
なんでいけるかというとinitialize
メソッドがなかなか特殊
initializeについて
http://ref.xaio.jp/ruby/classes/object/initialize
newに渡した引数は、そのままinitializeに渡されます。なお、initializeの戻り値は使われません。
つまり
Class名.initialize
ができない。
class Foo
def initialize
@name = 'taro'
end
end
foo = Foo.new
foo.initialize
=>`<main>': private method `initialize' called for #<Foo:0x007ff43112e800 @name="taro"> (NoMethodError)
initializeって普通のメソッドとは違うんですねー。(そりゃそうなんですが。ちなみにinstance_eval
を使うと取り出せたりします。)
ちょっと話が脱線しましたが、結局クラス内で定義しているインスタンス変数は
class Foo
def initialize(car,name)
@car = car
@name = name
end
def name
@name + @car
end
end
foo = Foo.new('トラック','ほんだ')
p foo.name
こんな感じで def name
みたいにメソッドにいれてあげないといけない。
このメソッドのことをゲッターという。
セッター
セッターは値を代入する、値を書き換えること
ゲッターの並びから見てみると
class Foo
def initialize(initname)
@name = initname
end
def set_name(name)
@name = name
end
end
foo = Foo.new('taro')
p foo.set_name('jiro')
set_name
の箇所でinitializeしたinitname
を
setnameに書き換えてる。
あと別の書き方もあったりする。
class Foo
def initialize(initname)
@name = initname
end
def name=(setname)
@name = setname
end
end
foo = Foo.new('taro')
p foo.name='jiro'
個人的には前者の方がいいかなと。
でもこれってめんどくさいな。クラス内でインスタンス変数使う場合に
毎回メソッドに定義して、あげるのとかめんどい。(initializeで全部宣言するのでもいいのかもだけど)
そんなときに使えるのがattr_accessor
さんですね。
class Foo
attr_accessor :name,:title,:contents,:text
def initialize
@name = 'aaa';
@title = 'bbb';
@contents = 'ccc';
@text = 'ddd'
end
end
foo = Foo.new
p foo.name
p foo.title
p foo.contents
p foo.text
=> 'aaa'
=> 'bbb'
=> 'ccc'
=> 'ddd'
こんな感じで、initialize
したインスタンス変数が
ゲッターを使わなくても、クラス外で使えてしまう。
便利っすねー。
以上ー