Class method(类方法,相当于java里的静态方法) ruby的class Method是属于类本身的方法。定义class method的方法与普通的实例方法不同的地方就是要在类方法的名称前加上类的名字,并用点号隔开类名和方法名。调用类方法时也需要在方法名前加类名,并用点号隔开。
例:
class MyClass
def MyClass.classMethod
Print "hello from class Method"
end
end
MyClass.classMethod
上面的脚本将输出:hello from classMethod。
Class Variables(相当于java的静态变量) 定义和引用一个class variable需要在变量名前加上两个@符号。当一个class variable首次声明时,必须给他一个初始值。在ruby中 class其实也是一个对象,它不仅能引用的class variable,它还有属于自己的instance variable。看下面的例子:
class MyClass
@@classvar=1000
@instvar=1000
def MyClass.classMethod
@@classvar+=10;
@instvar+=10;
end
def instMethod
@@classvar+=1;
@instvar=1;
end
def MyClass.showvars
puts("Class var @instvar=#{@instvar} @@classvar=#{@@classvar}")
end
def instshowvars
puts("Inst var @instvar=#{@instvar} @@classvar=#{@@classvar}")
end
end
3.times do
ob=MyClass.new
MyClass.classMethod
ob.instMethod
MyClass.showvars
ob.instshowvars
end
程序输出:
Class var @instvar=1010 @@classvar=1011
Inst var @instvar=1 @@classvar=1011
Class var @instvar=1020 @@classvar=1022
Inst var @instvar=1 @@classvar=1022
Class var @instvar=1030 @@classvar=1033
Inst var @instvar=1 @@classvar=1033
紧挨着@@classvar的声明的语句@instvar=1000定义了一个类的instance variable。这个变量是属于类本身的,不属于任何该类声明的对象。在实例方法中引用的@instvar没有1000这个初始值。再书中下面的例子:
class MyClass
@@classvar = 1000
@instvar = 1000
def MyClass.classMethod
if @instvar == nil then
@instvar = 10
else
@instvar += 10
end
end
def instanceMethod
if @instvar == nil then
@instvar = 1
else
@instvar += 1
end
end
end
ob = MyClass.new
puts MyClass.instance_variable_get(:@instvar)
puts( '--------------' )
for i in 0..2 do
#MyClass.classMethod
ob.instanceMethod
puts( "MyClass @instvar=#{MyClass.instance_variable_get(:@instvar)}")
puts( "ob @instvar= #{ob.instance_variable_get(:@instvar)}" )
end
程序输出:
1000
--------------
MyClass @instvar=1000
ob @instvar= 1
MyClass @instvar=1000
ob @instvar= 2
MyClass @instvar=1000
ob @instvar= 3
instance_variable_get方法是ruby提供的一个方法,可以查看class 或object的内部值。