Rubyのアクセス制限privateとprotectedを自分で試してみた


こんにちは、いなむーです。

Rubyのアクセス制限である、privateとprotectedを試したみたのでそのメモを残しておきます。

参考サイトにさせていただいたサイトはこちら↓

本来Rubyでは、レシーバーなしでのメソッド呼び出しはできない。
このため、自クラス及びサブクラス内のメソッドの呼び出すためには、selfというレシーバーを用いなければならないのだが、例外的にselfレシーバーだけは省略できる。
この省略形を関数形式と呼んでいる。

private

テストコード(1)

ここでは、privateに設定したメソッドを、関数形式で呼び出します。

class Sample1
  def call1
    call_private
  end

  def call_private
    p "private dayo"
  end

  private :call_private

end

s1 = Sample1.new
s1.call1

実行結果

$ ruby test2.rb
"private dayo"

正しく呼びだされていることがわかります。

テストコード(2)

ここでは、privateに設定したメソッドを、レシーバを指定して呼び出します。

class Sample1
  def call1
    self.call_private
  end

  def call_private
    p "private dayo"
  end

  private :call_private

end

s1 = Sample1.new
s1.call1

実行結果

$ ruby test2.rb
test2.rb:3:in `call1': private method `call_private' called for #<Sample1:0x007fee510bf008> (NoMethodError)
	from test2.rb:15:in `<main>'

呼び出しに失敗したことが分かります。
privateメソッドでは、レシーバを指定してメソッドを呼び出すことができないということが分かりました。

protected

テストコード

下記テストコードでは、privateにしていたメソッドをprotectedに変更して、関数形式とレシーバを指定した形式で実施してみました。

class Sample1
  def call1
    call_private
  end

  def call2
    self.call_private
  end

  def call_private
    p "private dayo"
  end

  protected :call_private

end

s1 = Sample1.new
s1.call1
s1.call2

実行結果。

$ ruby test2.rb
"private dayo"
"private dayo"

どちらも実行結果が返ってきました。

恐らくこれだけではテストが不十分ではありますが、さっくりと試すことができたので、次回はもう少し踏み込んでテストしてみようと思います。

以上。