0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

5/9  勉強の記録 Ruby アクセッサーメソッド

Last updated at Posted at 2019-05-09

アクセサメソッド
インスタンス変数の値を読み書きするメソッドのこと。

インスタンスメソッド
メソッドは実行する一連の処理をまとめたもの。
ただし、通常のメソッドがプログラム中からいつでも呼び出せるのに対してクラス内に記述されたメソッドはクラスから作成されたオブジェクトしか呼び出すことが出来ない。このようなメソッドをインスタンスメソッドと呼ぶ(Let'sプログラミングより参照)

Car.new.newはインスタンス変数ではない。クラスに対して実行するものなので、クラスメソッドと呼ばれる。


class Car
 def initialize(name)
  @name = name
 end
 
 def hello
  puts "Hello! I am #{@name}."
 end
 
 def name 
  @name
 end
 
 def name=(value)
  @name = value
 end
end


car = Car.new('Kitt')
puts car.name
car.name = 'hogehoge'
puts car.name
car.name = 'gehogeho'
puts car.name

インスタンス変数は外部からは書き換えられるようにできていないが、アクセッサーメソッドはそれをできるようにするもの。(だと今の所認識している)

上記を実行すると、
Kitt hogehoge gehogeho
と出力される。

 def name=(value)
  @name = value
 end

とすることで、のちに@nameを外部から変更することができる。

アクセッサーメソッド

def name 
  @name
 end
 
 def name=(value)
  @name = value
 end

ここではnamename=がアクセッサーメソッド。

attr_accessor
class Car の下に
attr_accessor :name
と書き加えることで

def name 
  @name
 end
 
 def name=(value)
  @name = value
 end

を省略できる。(attr_accessorはアクセッサーメソッドではない。アクセッサーメソッドを定義してくれるメソッドである)
こっちの方が楽。

class Car
 attr_accessor :name
 #attr_reader :name
 #attr_writer :name
 def initialize(name)
  @name = name
 end
 
 def hello
  puts "Hello! I am #{@name}."
 end
 
 # def name 
 #  @name
 # end
 
 # def name=(value)
 #  @name = value
 # end
end

car = Car.new('Kitt')
puts car.name
car.name = 'hogehoge'
puts car.name
car.name = 'gehogeho'
puts car.name

他にも
attr_reader :〇〇 ← 読む専門
attr_writer :〇〇 ← 書く専門
といったものもある。

0
1
3

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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?