3
0

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.

Ruby アクセサメソッド

Posted at

アクセサメソッドとは

インスタンス変数の値を読み書きするメソッドのこと。
Rubyはそのままではインスタンス変数にアクセスできない仕様になっています。

(例)

class Animal
  @name = ""
end

animal = Animal.new
animal.name = "cat"
puts animal.name # => ruby.rb:6:in `<main>': undefined method `name=' for #<Animal:0x00007fce4a8b4b40> (NoMethodError)

このコードの定義方法だと、@nameは"クラスインスタンス変数"という違う変数として定義され、インスタンスからがアクセスできない仕様になっています。

インスタンスからアクセスすることのできるインスタンス変数の定義はどのようにすれば良いのか。

そこで、"アクセサメソッド"を使用します。

まず、アクセサメソッドは3種類あります。

  • attr_reader
  • attr_writer
  • attr_accessor

attr_reader

attr_readerは、インスタンス変数にアクセスするためのゲッターです。

(例)

class Animal
  attr_reader :name 
  def initialize(name)
    @name = name
  end
end

animal = Animal.new("cat") 
puts animal.name # => cat

このように、attr_reader :nameと記述することで、インスタンス変数@nameにアクセスすることができます。
しかし、このままではセッターが定義されていないため、@nameをクラスの外から変更できません。

attr_writer

attr_writerは、インスタンス変数にアクセスするためのセッターです。

(例)

class Animal
  attr_writer :name
  attr_reader :name
  def initialize(name)
    @name = name
  end
end

animal = Animal.new("cat")
puts animal.name
animal.name = "dog"
puts animal.name 
# => cat
#    dog

このように、attr_reader :nameに加え、attr_writer :nameも記述することで、外からインスタンス変数@nameを変更し、アクセスできます。

attr_accessor

attr_readerとattr_writterの機能を一つにまとめたメソッドです。

(例)

class Animal
  attr_accessor :name
  def initialize(name)
    @name = name
  end
end
animal = Animal.new("cat")
puts animal.name
animal.name = "dog"
puts animal.name
# => cat
#    dog

このように外からインスタンス変数@nameを変更し、アクセスできます。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?