5

クラス

class A

  private
  def foo
    puts :foo
  end

  public
  def bar
    puts :bar
  end

  private
  def zim
    puts :zim
  end

  protected
  def dib
    puts :dib
  end
end

Aのインスタンス

a = A.new

テスト

a.foo rescue puts :fail
a.bar rescue puts :fail
a.zim rescue puts :fail
a.dib rescue puts :fail
a.gaz rescue puts :fail

テスト出力

fail
bar
fail
fail
fail

。テストを送信

[:foo, :bar, :zim, :dib, :gaz].each { |m| a.send(m) rescue puts :fail }

。出力を送信

foo
bar
zim
dib
fail

質問

「テスト出力」というラベルの付いたセクションは、期待される結果です。では、なぜ私は単純にプライベート/保護されたメソッドにアクセスできるのObject#sendですか?

おそらくもっと重要です:

Rubyのpublic//の違いは何ですか?それぞれをいつ使用しますか?誰かが実際の例と使用法を提供できますか?privateprotectedprivateprotected

4

1 に答える 1

8

技術的sendには、メソッドの可視性をチェックするために何もしないためです。(そうするのはもっと大変でしょう。)

哲学的に: Ruby は非常に寛容な言語です。クラスを開いて、必要なメソッドをパブリックにすることができます。言語設計者sendは、 によって通常課せられる制限をオーバーライドできるように実装しましたprivate。Ruby 1.9 には元々、private-respectingsendと unsafeという 2 つのバリアントが含まれる予定でしsend!たが、これは後方互換性のために削除されたようです。

privateprotectedと のpublic意味は次のとおりです。

  • publicメソッドは任意の送信者から呼び出すことができます
  • protectedメソッドのクラスのインスタンスまたはサブクラスのインスタンスの外部でメソッドを呼び出すことはできません
  • privateメソッドは明示的なレシーバーで呼び出すことはできません (常に明示的なレシーバーを持つ必要があるため、その方法でクラス内で呼び出すことができるセッター メソッドなどのいくつかの例外があります)
于 2010-03-25T20:39:53.107 に答える