アクセス制御メソッド

 
Javaでいうアクセス修飾子は、Rubyではメソッドとして提供される。

  • インスタンスメソッド用に、public、protected、private がある。
  • クラスメソッド用に、public_class_method、private_class_method がある。

デフォルトは、クラス内のメソッドであればpublic、トップレベルのメソッドの場合はprivateになる。
Javaではクラス・インタフェース・メソッド・フィールドに対してアクセス修飾子を付けられるが、Rubyではアクセス制御できるのはメソッド(initializeは常にprivateなので除く)だけ。
アクセス制御メソッドの引数には、メソッド名をStringオブジェクトまたはSymbolオブジェクトの形で渡す。引数を省略した場合はアクセス制御メソッドを記述した以降のメソッド全てにそのアクセス制御が適用される。
Javaと異なり、呼び出し方にも特殊な制限がある。


# 表記法1: 引数を指定しない
class Foo1
# publicメソッドになる
def meth_a
"a"
end

private

# privateメソッドになる
def meth_b
"b"
end

# privateメソッドになる
def meth_c
"c"
end
end

# 表記法2: 引数にメソッド名を指定する
class Foo2
# privateメソッドになる
def meth_a
"a"
end

# 指定するメソッドは定義済みでなければならない
# meth_bを指定するとエラーになる
private :meth_a

# publicメソッドになる
def meth_b
"b"
end
end

public

アクセス制限

制限無し。

呼び出し制限

制限無し。

protected

アクセス制限

自クラスまたはサブクラスに属するオブジェクトからのアクセスのみ可能。

呼び出し制限

自オブジェクトのメソッド定義式内から呼ばなければならない。


class Foo
def meth
puts "hello"
end

protected :meth

def call_meth
meth
end
end

foo = Foo.new

foo.meth => エラー:protected method 'meth' called for # (NoMethodError)
foo.call_meth => hello

private

アクセス制限

自クラスまたはサブクラスに属するオブジェクトからのアクセスのみ可能。

呼び出し制限

関数形式(レシーバを指定しない)で呼び出さなければならない。つまりselfが示す自オブジェクト以外からは呼べない。
ちなみにレシーバにselfを指定してもエラーになる。これはアクセス制限ではなく呼び出し方の制限のため。