LoginSignup
3

More than 5 years have passed since last update.

ゲッター、セッター、attr_accessor

Last updated at Posted at 2016-08-30

というわけでゲッター、セッターについて書いてみます。

ゲッター

ゲッターとは・・・インスタンス変数の値を取得するためのメソッド

うーむ。意味わかりません。
例えば以下のクラスから@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したインスタンス変数が
ゲッターを使わなくても、クラス外で使えてしまう。
便利っすねー。

以上ー

参考
http://qiita.com/Rudiments/items/c2c5251bcf49dfd7ce7a

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3