1
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 3 years have passed since last update.

attr_accessorについて

Last updated at Posted at 2020-07-15
1 / 2

##インスタンス変数とは
同じインスタンスの内部で共有される変数

class Food
  def initialize(name)
    #インスタンス作成時に渡された名前をインスタンス変数に保存する
   @name = name
  end

  def eat
  "I will eat an #{@name}"
  end
end
food = Food.new('apple')
food.hello #=> "I will eat an apple"

インスタンス変数はクラスの外部から参照することができない!

class Food
  def initialize(name)
   @name = name
  end

  #@nameを外部から参照するためのメソッド
  def name
  @name
  end
end
food = Food.new('apple')
#nameメソッドを経由して@nameの内容を取得
food.name #=> "apple"

インスタンス変数の内容を外部から変更したい場合も変更用のメソッドを定義

class Food
  def initialize(name)
   @name = name
  end

  #@nameを外部から参照するためのメソッド
  def name
  @name
  end

 #@nameを外部から変更するためのメソッド
  def name=(value)
    @name = value
  end
end
food = Food.new('apple')
#変数に代入しているように見えるが、実際はname=メソッドを呼び出している。
food.name = 'banana'
#nameメソッドを経由して@nameの内容を取得
food.name #=> "banana"

インスタンス変数の値を読み書きするメソッドのことを「アクセサメソッド」と呼ぶ。
これらのメソッドをいちいち書くのは面倒。
そこで登場するのが「attr_accessorメソッド」 
##attr_accessorメソッド

class Food
  #@nameを読み書きするメソッドが自動的に定義される
  attr_accessor :name

  def initialize(name)
   @name = name
  end

  #@nameを外部から参照するためのメソッド
  #def name
  #@name
  #end

 #@nameを外部から変更するためのメソッド
  #def name=(value)
    #@name = value
  #end
end
food = Food.new('apple')
#@nameを変更する
food.name = 'banana'
#@nameを参照する
food.name #=> "banana"

インスタンス変数の内容を読み取り専用にしたい場合は「attr_reader」
書き込み専用にしたい場合は「attr_writer」

参照
プロを目指す人のためのRuby入門

1
1
0

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