1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Rubyのプライベートとプロテクトを簡単にご紹介します。

2022-02-01 23:34:31

以下のプログラムには長い間困らされました。Rubyのprivateの概念は本当に奇妙です。

class Test private
 def test_print
  puts 'test'
 end
end

class Test2 < Test
 def test_print2
  # self.test_print #=> can't be called with self here, private method `test_print' called for # (NoMethodError)
  test_print #=> can be called without self
 end
end

Test2.new.test_print2 



なぜprivateはselfを追加せずに親クラスのメソッドを呼び出せるのか?

Rubyでは、Javaなどと違って、privateはサブクラスから呼び出すことができますが、呼び出し元を指定することはできないことがわかりました。

Ruby Way』に目を通すと、こう書いてある。

プライベート クラスもサブクラスも呼び出すことができますが、privateメソッドは呼び出し元を指定することができず、デフォルトはselfです。
protected: クラスとサブクラスの両方が呼び出され、呼び出し元を指定できる。

このことから、上のコードでselfを付けて呼び出すとエラーになり、selfを付けない場合は正しく実行されることが分かります。