Rubyがミニツク

あなたのRubyの技術に関するより詳しい知識と理解を増やします。

Ruby入門コース

このコースについて

Rubyのeラーニング研修システムはRailsを使ってWebアプリケーション開発ができる技術者の育成を目指します。 そのため、Railsを扱うことができるだけのRubyの知識を得ることがRuby入門コースの目標となっています。

コンテンツ一覧

ヒント レッスンの名前をクリックすると、その内容を表示します。

次のコンテンツ ホームへ戻る

アクセス制限

Rubyにおける可視性とは、主にメソッドの可視性に関する話です。言い換えると、Rubyの可視性とはメソッドをどこから呼び出せるかについて設定をおこなう機能です。

クラスの中でメソッドを定義すると、インスタンスメソッドとして呼び出すことができます。ただし、クラスの内部だけでしか使わない(外部に公開する予定の無い)メソッドも同じように呼び出せては困ります。そのような時に以下のメソッドを使うことによって、メソッドの可視性を変えることができます。

  • public
  • private
  • protected

これらを指定するには、以下のようなやり方があります。

  • 引数にメソッド名をシンボルで指定して、メソッドの可視性を変える
  • 引数を与えずにメソッドを呼び出して、可視性のデフォルトの設定を変える

publicに設定されたメソッドは、パブリックメソッドと呼びます。privateに設定されているメソッドのことを、プライベートメソッドと呼び、protectedに設定されているメソッドのことを、プロテクテッドメソッドと呼びます。

def foo
  puts("foo")
end

public :foo
private :foo

class Foo
  public
  def foo
    puts("foo")
  end
  private
  def bar
    puts("bar")
  end
  protected
  def baz
    puts("baz")
  end
end

クラスの中で定義したメソッドは(initializeメソッドを除いて)、何も設定をしていない状態だとpublicになります。publicはメソッドを呼び出すのにまったく制限がないことを表します。そのため、どこからでもpublicに設定されているメソッドは呼び出せます。privateはメソッドを定義したクラスの中か、そのクラスを継承したサブクラスのメソッドの中で呼び出せます。つまり、プライベートメソッドはオブジェクトの外側から使えません。

class Foo
  private
  def foo
    puts("foo")
  end
end
class Bar < Foo
  def call_foo
    foo
  end
end
bar = Bar.new
bar.call_foo

protectedはprivateと似ていますが、プロテクテッドメソッドは、クラス(またはそのクラスのサブクラス)に属してる各オブジェクトから呼び出せます。レシーバを指定した形やレシーバを指定しない形(つまり、関数的なメソッド)のどちらでも呼び出せます。

class Foo
  protected
  def foo
    puts("Protected Method foo")
  end
  private 
    def bar
      puts("Private Method bar")
    end
  public 
  def useFoo(o)
    o.foo
  end
  def useBar(o)
    o.bar
  end
end


fooReciever = Foo.new
fooSender = Foo.new

fooSender.useFoo(fooReciever) # "Protected Method foo"が表示される
fooSender.useBar(fooReciever) # NoMethodErrorが発生します

アクセス制限を設定したメソッドがどのように扱われるかの例をあげます。メソッドの可視性がprivateに設定されているメソッドは、以下のように使われることが多いようです。

  • 一般公開しない作業用のメソッド
  • 関数的に使われるメソッド

メソッドの可視性がprotectedに設定されているメソッドは、ユーザが使っていると再定義した時に影響が出ます。そのため、メソッドの機能が変わるような大きな変更をしないメソッドとして扱われることが多いようです。


次のコンテンツ ホームへ戻る