0
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 1 year has passed since last update.

【Ruby】selfでinitializeメソッドからセッターメソッドを呼び出す

Posted at

概要

メタプログラミングの学習を進めてて、つまずいたのでメモ程度に残していきます。
initializeメソッドとセッターメソッドを深掘りします。

initializeメソッドとセッターメソッドの定義

initializeメソッドを定義しセッターメソッドを定義すると次のようになります。

class Car
    attr_accessor :name
    def initialize(name)
        @name = name
    end
    
    
    def say
        "私の車は#{name}です"
    end
    
end

my_car1 = Car.new("toyota")
p my_car1.name
p my_car1.say

# =>"toyota"
# =>"私の車はtoyotaです

通常ですと、変数の受け渡しにインスタンス変数(@name)を使用しますが、
これをローカル変数に変えてみます。

class Car
    attr_accessor :name
    def initialize(name)
        name = name
    end
    
    
    def say
        "私の車は#{name}です"
    end
    
end

my_car1 = Car.new("toyota")
p my_car1.name
p my_car1.say

# => nil
# => "私の車はです"

nameメソッドを呼び出した時点でnilが発生します。これは、インスタンス変数であるnameがローカル変数となっているため、class内で変数を共有できなかったことが問題となっています。

そこで、セッターメソッドを明示的に指定することで、インスタンス変数を保持することができます。
selfを使用してレシーバを指定します。

class Car
    attr_accessor :name
    def initialize(name)
        self.name= name  #=> name= メソッドを呼び出してる
    end
    
    
    def say
        "私の車は#{name}です"
    end
    
end

my_car1 = Car.new("toyota")

p my_car1.name # =>"toyota"
p my_car1.say  # =>"私の車はtoyotaです"

これで、明示的にセッターメソッドを呼び出していることがわかります。
ちなみにsayメソッドの中にあるnameインスタンスにselfを使用しても呼び出すことができますが、使用しなくでも呼び出しができます。




  def say
        "私の車は#{self.name}です"
    end
.
.
.

ゲッターメソッドに使用するとコードが煩雑になりますので、使用する必要がないことも覚えておきましょう。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?