【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