本文已参与「新人创作礼」活动,一起开启掘金创作之路。
类变量
以@@ 开头的变量称为类变量。类变量是该类所有实例的共享变量,这一点与常量类似,不同的是我们可以多次修改类变量的值。另外,与实例变量一样,从类的外部访问类变量时也需要存取器。不过,由于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 的方法,在同一个类(及其子类)中可作为实例方法使用,而在除此以外的地方则无法使用。