美文网首页
Ruby 限制方法的访问

Ruby 限制方法的访问

作者: changsanjiang | 来源:发表于2017-10-21 12:39 被阅读38次

    到目前为止, 之前我们定义的方法都能作为实例方法被任意调用. 但是有时候我们可能并不希望这样. 例如, 一些处理方法, 一般不会公开给外部使用.

    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 #<AccTest:0x007fbde88358f8> (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 #<Point:0x007fe6420257f8 @x=20, @y=10> (NoMethodError))
    

    相关文章

      网友评论

          本文标题:Ruby 限制方法的访问

          本文链接:https://www.haomeiwen.com/subject/ykliuxtx.html