Ruby - 类与对象
Page content
Ruby 中定义一个类非常简单:
class Person
end
Ruby 中所有类都自动继承自Object类。
通常类的名称是大写字母开头。类总是存在一个默认空参数的构造函数:
def initialize
end
实例化一个类对象使用 new 方法,例如:
person = Person.new
作为一个对象,当然有其变量(属性)和方法。先从变量开始。
各种变量
Ruby 中有四种变量:局部变量、全局变量、对象变量、类变量。 Ruby 的变量有前缀的说法,这不同于其它语言的变量。
局部变量
类似于 Java、Ruby 等其它语言一样,局部变量只能适用于代码块内, 一旦离开了局部变量定义的代码块就失效了。例如:方法内、代码块内等。
局部变量的定义和其它语言一样,没有前缀,例如:
x = 10
p = Person.new
全局变量
全局变量一旦定义后可以在程序的任何地方进行访问,很显然这个面向对象的思想冲突。 因此全局变量在 Ruby 中使用不多。
全局变量有前缀$,使用方法如下:
$VERSION = [1,2,0]
puts $VERSION
对象变量(实例变量)
对象变量也成为类实例变量,它的作用域关联于对象的生命周期,同 Java/Python 中的对象变量。 对象变量有前缀@,例如:
class Person
def initialize(name='',age=0)
@name = name
@age = age
end
def to_s
"#{@name}, #{@age}"
end
end
p = Person.new('Ady Liu',29)
puts p.to_s
=> Ady Liu, 29
默认情况下,是不能通过 p.name 或者 p.@name 来访问实例变量的。 如果要在类外部访问实例变量,则需要增加属性操作符,例如:
class Person
def initialize(name='',age=0)
@name = name
@age = age
end
attr_writer :name
attr_reader :name
attr_accessor :age
end
p = Person.new('Ady Liu',29)
p.age = 30
puts p.age
类变量
类变量作用域整个类中,所有类共享一个变量,这与 Java、Python 的静态变量一样。 类变量使用@@前缀来描述,例如:
class Child
@@count = 0
def initialize
@@count += 1
end
def count
@@count
end
end
c=Child.new
c2=Child.new
puts c.count #print 2
puts c2.count #print 2
不同于 Java、Python,类变量在类外部不能直接被访问。
类方法和对象方法
前面已经定义很多对象方法了,下面的例子定义了类的方法(类似于 Java、Ruby 中静态方法)。
class Child
@@count = 0
def initialize
@@count += 1
end
def count
@@count
end
def Child.count
@@count
end
end
puts Child.new.count
puts Child.count
静态方法定义也可以使用 self 来定义,例如
def self.count
@@count
end
这和其它语言 self 的语义有一些差别,为了容易理解,建议同意使用类名称来定义类方法。