こんにちは、いなむーです。
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 `
[/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]
どちらも実行結果が返ってきました。
恐らくこれだけではテストが不十分ではありますが、さっくりと試すことができたので、次回はもう少し踏み込んでテストしてみようと思います。
以上。