[Ruby] アクセス制御の種類 public, private, protected
初めに
今回はRubyの3段階のアクセス制御であるpublic
、private
、protected
について掘り下げる。
本題
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
からは、同クラスでも呼び出すことができない。