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_writer
とattr_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")
これは使用用途に合わせて使う場合がありますので覚えておきましょう!