2

したがって、(1.9.3 を使用した) ruby​​ のすべてのメタプログラミングには、現在の可視性を返すメソッドがあると思います。と呼ばれるとしましょうvisibility

class Foo
  puts visibility
  # => "public"

  private
  puts visibility
  # => "private"
end

では、visibilityRuby インタープリターが新しいメソッド定義を見つけたときに使用する現在の可視性を取得するにはどうすればよいでしょうか?

4

2 に答える 2

1

私の知る限り、すぐに使用できる方法はありません。ただし、(テストされていない)の行に沿って何かを実装することもできます

class Class
  def visibility
    define_method(:__visibility_discovery__) { }
    visibility =
      if protected_method_defined? :__visibility_discovery__
        "protected"
      elsif private_method_defined? :__visibility_discovery__
        "private"
      else
        "public"
      end
    remove_method :__visibility_discovery__
  end
end
于 2012-10-30T18:56:11.883 に答える
0

Ruby では、インスタンス メソッドに対して 3 つの異なるレベルの可視性があります。

メソッドのデフォルトは ですpublic。これは、おそらく慣れ親しんでいるものです。オブジェクトにアクセスできる場合は、常にこのメソッドにアクセスできます。

privateprotected似ています。クラスとサブクラスからのみアクセスできます。違いは、publicメソッドを明示的なレシーバーで呼び出すことができないことです。privateつまり、同じクラスの別のインスタンスから別のメソッドの関数を呼び出すことはできますが、呼び出すことはできませんprotected

したがって、クラス外でメソッドを使用できるようにする必要がある場合は、デフォルトの可視性を維持してくださいpublic。カスタム比較ロジックなど、そのクラスのインスタンスからメソッドにアクセスする必要がある場合は、 を使用しますprotected。また、メソッドがそのクラスのインスタンスの外部で表示されてはならないものである場合は、private.

実際にあなたの質問に答えるにvisbilityは、可視性の現在の状態を返すメソッドがあります-それが、、、publicまたはprivateですprotected

于 2012-10-30T14:45:10.873 に答える