122
84

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.

attr_accessorの使い方を解説してみる

Last updated at Posted at 2018-05-05

##attr_accessorとは

インスタンス変数を直接変更して操作ができるようにするもの。

##簡単に説明
例えば、Perosonクラスがあったとしましょう。

class Person    
                                                                                    
  def initialize name
    @name = name
  end

  def say
     puts "私の名前は" + @name + "です"
  end

end

person = Person.new "taro"
person.say

実行結果

私の名前はtaroです

①personインスタンスを生成した時にインスタンス変数(@name)にtaroが入る。
②personに対してsayメソッドを呼び出して値を保持したインスタンス変数(@name)を表示。

という流れです。

しかし、クラスの外からインスタンス変数(ここでいう@name)を変更させたいと思ったとき、どのようにすれば良いのでしょうか。

次の例をみてみましょう。

class Person   
                                                                                   
  def initialize name
    @name = name
  end

  def say
     puts "私の名前は" + @name + "です"
  end
end

person = Person.new "taro"
person.name = "hanako" #インスタンス変数の値を更新
person.say

実行結果
undefined method `name=' for #<Person:0x007fad1d0e35b8 @name="taro"> (NoMethodError)

インスタンスから直接nameを変えようとしましたが、nameなんてメソッド定義してねぇよ!と怒られます。
もちろん、person.@name = "hanako" とするのもダメです。
これはインスタンス変数にアクセスできていないからです。

そこでインスタンス変数にアクセスさせるために使うのが、attr_accessorというもの。
今回はインスタンス変数である@nameの値を変えたいので、次のように追記します。

class Person 
  attr_accessor :name #追加
                                                                                     
  def initialize name
    @name = name
  end

  def say
     puts "私の名前は" + @name + "です"
  end
end

person = Person.new "taro"
person.name = "hanako" #インスタンス変数の値を上書き
person.say

実行結果
私の名前はhanakoです

これでクラス外からインスタンス変数であるnameを操作できるようになりました。

attr_accessor : (インスタンス変数) とすれば、指定されたインスタンス変数が外部からでも変更できるようになるので必要に応じて設定するようにしてみましょう。

122
84
4

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
122
84

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?