はじめに
railsアプリを作成する中で、priate
とprotected
の違いが分からなかったため調べてみました。
とても噛み砕いた内容になるかと思いますので、ご了承ください。
privateとprotected
共通点
クラス外からは呼び出す事ができない。
class Food
private
def breakfast
p "パン"
end
protected
def lunch
p "パスタ"
end
end
food = Food.new
food.breakfast
# >> エラー
food.lunch
# >> エラー
同じクラスのインスタンスの中であれば呼び出せる。
class Food
def morning
breakfast
end
def noon
lunch
end
private
def breakfast
p "パン"
end
protected
def lunch
p "パスタ"
end
end
food = Food.new
food.morning
# >> "パン”
food.noon
# >> "パスタ"
protected
protectは上記に加え、生成した別のインスタンスが同じクラスを持っていたら呼び出す事ができます。
class Food
def set_like_food(food)
@food = food
end
def my_like_food(food2)
p "私の好きな食べ物は、#{get_like_food}と、#{food2.get_like_food}です。"
end
private
def get_like_food
@food
end
end
food1 = Food.new
food1.set_like_food("パン")
food2 = Food.new
food2.set_like_food("パスタ")
food1.my_like_food(food2)
def my_like_food(food)
の#{get_like_food}
では呼び出し元の値である「"パン"」が入っており、上記で説明した、クラス内の他のインスタンスから呼び出せています。
しかし#{food2.get_like_food}
の「food2」は、呼び出し元の「food1」とは異なるインスタンスです。
つまり、food1のメソッドをfood2が#{food2.get_like_food}
のように使用しようとしています。
その場合、get_like_food
メソッドがprivateメソッドだと呼び出せません。
逆にprotectedだと呼び出せます。
終わりに
自分で見返した時理解できるように、自分なりに噛み砕いて記述したため分かりずらい部分やずれた理解をしている部分があるかもしれません。
その際はコメントで教えてえただけると嬉しいです!