实例变量(instance variable)

顾名思义实例变量就是ruby类的实例的变量,是不是听得有些拗口?没关系我们来看代码:

1
2
3
4
5
6
7
class People
def initialize(name)
@name = name
end
end

p1 = People.new("小明")

这里我们可以看到我在People类的初始化方法中传入name参数,然后把参数的值赋给@name变量,这个@name变量就是我们所称的实例变量。而且这些变量是存在于实例的本身的,如下图所示:

获取实例变量

我们上面初new了一个People的对象p1,这个对象中含有一个@name的变量。那我们如何获取@name这个变量的值呢?同时我们如何修改这个变量的值呢?

有两种方法:

  1. 我们给类定义两个方法,一个写方法、一个读方法。这种写法类似java里的setsgets的写法。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class People
    def initialize(name)
    @name = name
    end

    def name
    @name
    end

    def name=(name)
    @name = name
    end
    end

    p1 = People.new("小明")
    p1.name # => 小明
    p1.name= "小刘"
    p1.name # => 小刘
  2. 我们可以使用ruby提供的内置的类宏,attr_reader生成写方法、 attr_writer生成读方法、attr_accessor生成这两种方法。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class People
    attr_accessor :name
    def initialize(name)
    @name = name
    end
    end

    p = People.new("小明")
    p.name # => 小明
    p.name= "小花"
    p.name # => 小花

    类实例变量(Class instance variable)

    我们都知道ruby世界里一切都是对象,类也不例外。我们这里的People类也是一个对象,生成它的是Class类。当类作为一个对象的时候,那些适用于对象的规则也适用于类。也就是说当People类当做一个对象的时候,它也有自己的实例变量。这个变量是存在于People类里的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class People
    @name = "哈哈"

    def self.name
    @name
    end

    end

    People.name # => "哈哈"

    这里类定义的时候self有类本身充当,因此这个实例变量@name属于这个类。

类变量(Class Variable)

ruby类中还有一种以@@打头的类变量。类变量和类实例变量不同,它可以被子类和类的实例所访问。(这种行为有点类似java里的静态成员变量)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class A
@@name = "A"

def self.name
@@name
end

def name
@@name
end
end

class B < A
def self.name
@@name
end

def name
@@name
end
end

A.name # => "A"
A.new.name # => "A"
B.name # => "A"
B.new.name # => "A"