今回は定義したメソッドへのアクセス権について説明していきます。Rubyでは下記の3種類の呼び出し制限を設定できます。
- public
- private
- protected
public
publicはクラス定義の外からでもインスタンスメソッドとして普通に呼び出すことができます。メソッドを定義した際、通常ではこの設定がデフォルトとなっています。記述方法は下のような感じです。
「newメソッド」の際に自動的に呼び出される「initializeメソッド」では常に「private」と定義されています。「initializeメソッド」はアクセス権を「public」に定義し直すことはできません。
1 2 3 4 5 6 7 8 9 10 |
class Limit def pub puts "pubメソッド" end public :pub end obj = Limit.new obj.pub #=> "pubメソッド"と表示 |
また、さっき言ったとおりデフォルトで通常はpublicとなっているのでわざわざ定義しなくても大丈夫です。
private
privateで呼び出し制限されたメソッドは、レシーバを指定してから呼び出すことができなくなるので、クラスの外側から呼び出すことはできません。
1 2 3 4 5 6 7 8 9 10 |
class Limit def priv puts "privメソッド" end private :priv end obj = Limit.new obj.priv #=> エラー |
C:\Users>limit.rb C:/Users/limit.rb:40:in <main>': private method priv' called for #<Limit:0x000000008cf848> (NoMethodError)
具体的にはこのようなエラーが表示されます。
「private」でアクセス権を定義されたメソッドはクラスの中からレシーバを指定せずに呼び出せば実行可能なので下記のように記述すれば他のインスタンスメソッドからは呼び出すことができます。例として「pub」という「priv」メソッドの呼び出しのみを行うメソッドを定義してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Limit def priv puts "privメソッド" end private :priv def pub priv end end obj = Limit.new obj.pub |
privメソッド
9行目の「priv」は意味合い的には「self.priv」となりますが、「private」でアクセス権を定義されたメソッドはレシーバを指定して呼び出すことができないためこう書いてしまうとエラーが発生します。
publicやprivateを複数まとめて設定する方法
publicやprivateの設定を複数まとめて行うこともできます。メソッドを示すシンボルを複数記述をせずとも下記のように記述すればOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class Limit public # ここより下に記述すればpublicになります def pub puts "pubメソッド" end def pub1 priv end private # ここより下に記述すればprivateになります def priv puts "privメソッド" end end Limit.new.pub #=> "pubメソッド"と表示 Limit.new.pub1 #=> 結果的に"privメソッド"と表示 Limit.new.priv #=> エラー |
コメントを残す