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

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

参考サイトにさせていただいたサイトはこちら↓
[blogcard url=http://ubiqlog.com/archives/9421]

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

private

テストコード(1)

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

[code]
class Sample1
def call1
call_private
end

def call_private
p "private dayo"
end

private :call_private

end

s1 = Sample1.new
s1.call1
[/code]

実行結果

[code]
$ ruby test2.rb
"private dayo"
[/code]

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

テストコード(2)

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

[code]
class Sample1
def call1
self.call_private
end

def call_private
p "private dayo"
end

private :call_private

end

s1 = Sample1.new
s1.call1
[/code]

実行結果

[code]
$ ruby test2.rb
test2.rb:3:in `call1′: private method `call_private’ called for #<Sample1:0x007fee510bf008> (NoMethodError)
from test2.rb:15:in `<main>’
[/code]

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

protected

テストコード

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

[code]
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
[/code]

実行結果。

[code]
$ ruby test2.rb
"private dayo"
"private dayo"
[/code]

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

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

以上。

カテゴリー: ProgramRuby