Ruby制限メソッドのアクセス

2073 ワード

これまでに定義手法はいずれもインスタンス手法として任意に呼び出すことができる.しかし、時にはそう望んでいないかもしれません.例えば、いくつかの処理方法は、一般に外部に開示使用されない.
Rubyは3つのメソッドのアクセスレベルを提供し、必要に応じて柔軟に調整することができます.
  • public---この方法
  • が例示的な方法として外部に開示.
  • private---受信者を指定する場合、このメソッドを呼び出すことはできません(デフォルトの受信者でのみ呼び出すため、インスタンスの外部からアクセスできません)
  • .
  • protected---同じクラスでこのメソッドをインスタンスメソッドとして呼び出すことができる.

  • メソッドのアクセスレベルを変更すると、この3つのキーワードにメソッド名を表す記号を指定します.
    class AccTest
        def pub
            puts "pub is public method."
        end
        
        public :pub     #   pub       public(     public,     )
        
        
        def priv
            puts "priv is private method."
        end
        
        private :priv   #   priv       private.
    end
    
    AccTest.new.pub
    AccTest.new.priv  #   
    

    AccTestという二つの方法はpub方法が正常に呼び出すことができる.ただし、privメソッド呼び出し時にエラーが発生しました(private method`priv'called for#<0 x 007 fbde 88358 f 8>(NoMethodError))
    複数のメソッドのアクセスレベルを統一的に定義する場合は、次の構文を使用します.
    class AccTest
        
        public  #       ,
                #           
        
        def pub
            puts "pub is public method."
        end
        
        
        private #            private
        
        def priv
            puts "priv is private method."
        end
        
    end
    

    アクセス・レベルが指定されていないメソッドのデフォルトはpublicですが、initializeメソッドは例外で、privateとして定義されます.
    protectedと定義メソッドは、同じクラス(およびそのサブクラス)でインスタンスメソッドとして使用できるが、それ以外の場所では使用できない.
    class Point
        attr_accessor :x, :y
        protected :x=, :y=      #   setter         ,                .            
        
        def initialize(x:, y:)
            @x, @y = x, y
        end
    
        def swap()     #    x, y   
            self.x, self.y = self.y, self.x #        x=, y=
                                            #      
            return self
        end
    end
    
    point  = Point.new(x: 10, y: 20)
    puts "x = #{point.x} y = #{point.y}"    #=> x = 10 y = 20
    point.swap
    puts "x = #{point.x} y = #{point.y}"    #=> x = 20 y = 10
    
    point.x = 222 #=>   (protected method `x=' called for #<0x007fe6420257f8> (NoMethodError))