[Ruby] アクセス制御の種類 public, private, protected

初めに

今回はRubyの3段階のアクセス制御であるpublicprivateprotectedについて掘り下げる。



本題


public

制限なしに呼び出すことができる。クラス内ではデフォルトでpublic定義される。

class User
  def hello
    p "こんにちは"
  end

  user = User.new
  user.hello
  # => "こんにちは"
end



private

関数形式(メソッド定義内)でしか呼び出すことができない。
クラス外ではデフォルトでprivate定義される。
(今回はclass内でModule#privateを用いてprivateに変更する)

class User
  def greeting
    morning
  end
    
  private
    
  def morning
    p "おはよう"
  end

  user = User.new

  user.morning 
# => ... `<class:User>': private method `morning' called for
 #<User:0x00007fd579907b20> (NoMethodError)

 user.greeting
# => "おはよう"

end

private下のmorningメソッドを直接呼び出すと、エラーが発生するがgreetingメソッド内では呼び出すことができる



protected

レシーバーが同クラスか、サブクラスであれば呼び出すことができる

class User
  def set_name(name)
    @name = name
  end

  def greet(user)
    p "#{get_name}さんが#{user.get_name}さんに挨拶しました"
  end

  protected

  def get_name
    @name
  end

  user_1 = User.new
  user_1.set_name("佐藤")

  user_2 = User.new
  user_2.set_name("鈴木")

  user_1.greet(user_2)
#=> "佐藤さんが鈴木さんに挨拶しました"
end


protectedをprivateに変更する

   private

    def get_name
        @name
    end
...

  user_1.greet(user_2)
 # => 
user.rb:7:in `greet': private method `get_name' called for #<User:0x00007feafc03f5b8 @name="鈴木"> (NoMethodError)
...
end

protectedの部分をprivateに変更すると、エラーが発生する。privateであると引数にわたっているuserからは、同クラスでも呼び出すことができない。



参考