重返Ruby之路 Day11 --- ruby学习

201 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

类变量

以@@ 开头的变量称为类变量。类变量是该类所有实例的共享变量,这一点与常量类似,不同的是我们可以多次修改类变量的值。另外,与实例变量一样,从类的外部访问类变量时也需要存取器。不过,由于attr_accessor 等存取器都不能使用,因此需要直接定义。

例如:

class HelloCount
  @@count = 0      # 调用hello方法的次数  
  def HelloCount.count  # 读取调用次数的类方法    
    @@count  
  end  
  def initialize(myname="Ruby")    
    @name = myname  
  end  
  def hello    
    @@count += 1     # 累加调用次数    
    puts "Hello,world. I am #{@name}.\n"  
  end
end
bob = HelloCount.new("Bob")
alice = HelloCount.new("Alice")
ruby = HelloCount.newp 
HelloCount.count      #=> 0
bob.hello
alice.hello
ruby.hello
p HelloCount.count      #=> 3

限制方法的调用

有时候并不想定义的方法都能作为实例方法被任意调用,。例如,只是为了汇总多个方法的共同处理而定义的方法,一般不会公开给外部使用。

Ruby提供了3种方法的访问级别,可以按照需要来灵活调整:

public……以实例方法的形式向外部公开该方法

private……在指定接收者的情况下不能调用该方法(只能使用缺省接收者的方式调用该方法,因此无法从实例的外部访问)

protected……在同一个类中时可将该方法作为实例方法调用

在修改方法的访问级别时,需要为这3个关键字指定表示方法名的符号。

使用public 和private 的例子:

class AccTest
  def pub    
    puts "pubis a public method."  
  end  
  public :pub   # 把pub方法设定为public(可省略)  
  def priv
    puts "priv is a private method."  
  end  
  private :priv # 把priv方法设定为private
end
acc = AccTest.new
acc.pub
acc.priv

AccTest 类的两个方法中,pub 方法可以正常调用,但是在调用priv 方法时程序会发生异常,并出现报错。

希望统一定义多个方法的访问级别时,可以使用下面的语法。

class AccTest
  public   # 不指定参数时,           
           # 以下的方法都被定义为public  
  def pub    
    puts "pubis a public method."
  end  
  private   #以下的方法都被定义为private  
  def priv  
    puts "priv is a private method."  
  end
end

注:  没有指定访问级别的方法默认为public ,但initialize 方法是个例外,它通常会被定义为private。

而定义为protected 的方法,在同一个类(及其子类)中可作为实例方法使用,而在除此以外的地方则无法使用。