0
0

More than 1 year has passed since last update.

【Ruby】initializeメソッドとattr_accessorメソッド

Last updated at Posted at 2022-12-25

initializeメソッドとは

classがnewメソッドによりインスタンスを作ったときに、インスタンス変数の情報を持たせることができます。特に、classを使用して違う値のインスタンス変数を設定するために、値を初期化したい場合にinitializeメソッドが必要となります。

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

my_car1 = Car.new("jeep") # => <Car:0x00005630c9be96a0 @name="jeep">
my_car2 = Car.new("benz") # => <Car:0x00005630c9be93d0 @name="benz">

ゲッターメソッドとは

my_car1にはjeepというインスタンス変数が定義されています。これを取り出してみたいと思います。


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

my_car1 = Car.new("jeep")

p my_car1.name => NoMethodError

errorが発生します。
インスタンス変数は外部には取り出せません。これはインスタンス変数がClass定義の外では使えないためです。

そこで、インスタンス変数をclass定義より外で使えるように、専用のメソッドを定義します。

class Car
    def initialize(name)
        @name = name
    end
    
    def name
        @name # =>jeepを外で使えるメソッドように定義する。
    end
    
end

my_car1 = Car.new("jeep")

my_car1.name # => "jeep"

nameメソッドに@nameを定義することで、インスタンス変数を保持できるようになります。
このメソッドをゲッターメソッドと呼びます。

# セッターメソッド
次に、my_car1の持っているインスタンス変数の情報を書き換えたいとします。
このメソッドをセッターメソッドと呼びます。
方法としては、インスタンス変数の名前に@を外した状態で=をつけてメソッドを定義します。

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

my_car1 = Car.new("jeep")

my_car1.name ="benz"
# => my_car1.name=("benz") これでも動く

パッと見ると分かりにくいですが、name=メソッドを定義していることがまず分かります。
また、引数にnameがあることから、name=というメソッドを定義して引数に新しいインスタンス変数を入れたいことがわかります。
ですので、新しい引数の情報を持たせる方法として()をつけても通常のように動きます。
=を使うことで代入している形になるので分かりにくいですが、読み解いていくと理解できると思います。

attr_accesorメソッド

セッターメソッドとゲッターメソッドは、コードを書いていく中で使用されることが多いメソッドです。
これをいちいち書くのは面倒ですので、attr_accesorメソッドというものが用意されています。

class Car
    attr_accessor :name
    def initialize(name)
        @name = name
    end
    
end

my_car1 = Car.new("jeep")

my_car1.name=("benz")

これでセッターメソッドとゲッターメソッドをそれぞれ定義しなくても使用することができます。
また、セッターメソッドとゲッターメソッドはattr_writerattr_readerにそれぞれ分けて使用することもできます。

class Car
    attr_writer :name   #=> セッターメソッドの定義
    attr_reader :name   #=> ゲッターメソッドの定義
    def initialize(name)
        @name = name
    end
    
end

my_car1 = Car.new("jeep")

my_car1.name=("benz")

これは使用用途に合わせて使う場合がありますので覚えておきましょう!

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