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 的语义有一些差别,为了容易理解,建议同意使用类名称来定义类方法。

类继承

覆写方法

反射

封装

多态

嵌套类