【Ruby】メソッドの可視性(public、protected、private)
【Ruby】メソッドの可視性(public、protected、private)
Rubyのメソッドには、public
protected
private
の3種類の可視性があります。
可視性の特徴
- public:すべてのインスタンスから実行できる(デフォルト)。
- protected:クラスの外からは呼び出せない。自分自身、またはサブクラスのインスタンスから実行できる。
- private:クラスの外からは呼び出せない。自分自身のインスタンスから実行できる。
可視性の変更
以下のようにしてメソッドに可視性を変更できる。
可視性の変更方法1
クラス内で可視性(public、protected、private)を書くと、以降のメソッドが指定した可視性に変更される。
class Baz # デフォルトはpublic def default_method "デフォルトのメソッド" end public def public_method "publicのメソッド" end protected def protected_method "protectedのメソッド" end private def private_method1 "privateのメソッド1" end # 可視性は直前のメソッドではなく、以降のメソッドに対して適用されるため、private_method2もprivateになる。 def private_method2 "privateのメソッド2" end end
可視性の変更方法2
変更したい可視性 :メソッド名
という記述でも、可視性を変更することができる。
class Baz def default_method "デフォルトのメソッド" end def public_method "publicのメソッド" end def protected_method "protectedのメソッド" end def private_method1 "privateのメソッド1" end def private_method2 "privateのメソッド2" end public :public_method protected :protected_method private :private_method1, :private_method2 end
public
publicが設定されたメソッドは、すべてのインスタンスから実行することができる。メソッドにはデフォルトでpublicが設定されている。
class Baz def default_method "デフォルトのメソッド" end public def public_method "publicのメソッド" end end Baz.new.default_method #=> "デフォルトのメソッド" Baz.new.public_method #=> "publicのメソッド"
protected
protectedが設定されたメソッドは、クラスの外からは呼び出すことができない。自分自身、またはサブクラスのインスタンスから実行できる。
class Baz protected def protected_method "protectedのメソッド" end end Baz.new.protected_method #=> NoMethodError
class Baz def initialize(a) @a = a end def default_method(a) "#{protected_method}, #{a.protected_method}" end protected def protected_method @a end end baz1 = Baz.new("baz1") baz2 = Baz.new("baz2") baz1.default_method(baz2) #=> "baz1, baz2"
private
privateが設定されたメソッドは、クラスの外からは呼び出すことができない。
class Baz private def private_method "privateのメソッド" end end Baz.new.private_method #=> NoMethodError
class Baz def initialize(a) @a = a end def default_method(a) "#{private_method}, #{a.private_method}" end private def private_method @a end end baz1 = Baz.new("baz1") baz2 = Baz.new("baz2") baz1.default_method(baz2) #=> NoMethodError