1

Ruby でアクセス制御を指定するには 2 つの方法があるようです。1 つはメソッドで指定されたアクセス修飾子を持ち、もう 1 つは ACL 関数へのリストとして指定されます。

メソッドで指定されたアクセス修飾子で例

class MyClass
    public
        def method1
            #...
        end
    private
        def method2
            #...
        end

end

ACL関数へのリストとしてアクセスを指定する別の方法

class MyClass
        def method1
            #...
        end
        def method2
            #...
        end
        public :method1
        private :method2
end

どちらか一方を使用する理由はありますか?

4

2 に答える 2

1

通常、最初に説明した方法を使用します。最初にすべてのパブリック メソッドをグループ化し (public最初はデフォルトであるため、指定なし)、次にすべての保護されたメソッドをグループ化し、最後にすべてのプライベート メソッドをグループ化します。例:

class C

  def first_public_method
    #...
  end

  def second_public_method
    #...
  end

  protected

    def protected_method_1
      #...
    end

    def protected_method_2
      #...
    end

  private

    def one_private_method
      #...
    end

    def another_private_method
      #...
    end

end

質問で説明した2番目の方法は、ほとんどの場合、いくつかのトリックを行うために使用されることはほとんどありません. たとえば、最初の方法では不可能な次のことを実行できます。

  • 特定の可視性を持つ必要があるメソッドのリストを動的に作成し、動的リストを使用して適切なメソッドを呼び出してその可視性を設定します。public(*an_array_containing_names_of_all_methods_that_should_be_public)

  • クラスが定義された後にメソッドの可視性を変更する

上記の 2 番目のポイントの例:

class C

  #...

  private

    def a_private_method
      #...
    end

end

instance = C.new
instance.a_private_method # raises NoMethodError

C.send(:public, :a_private_method) # changes the visibility of the method dynamically to public
instance.a_private_method # executes the formerly private method without error
于 2013-08-21T14:36:58.990 に答える
0

メソッドでモディファイアを指定すると、それはメソッド定義のすぐそこにあり、どこかに隠されているわけではありません。慣習的に、ファイルの下部にあるすべてのプライベート メソッドを 1 つの修飾子でグループ化することができます。これは、、、(その他?) などのこれらの修飾子が「矛盾するものに遭遇するまで、この行の下のすべて」として機能するためですprivateprivatepublicmodule_function

別の方法として、メソッド フォームを使用することもできますが、わかりやすいようにできるだけ上部に配置します。ちょっと待って、それは「このメソッドは定義されていないので、私は一体何をプライベートにしているのでしょうか???」につながりますか? 例外?その場合、私はそれらを一番下にグループ化します。途中で散らかさないのがポイント。

于 2013-08-21T14:15:15.677 に答える