查看完整版本: A.5 变量和它的作用域---(2)

quzhongwei 2008-6-13 16:16

A.5 变量和它的作用域---(2)

3、实例变量
        在Ruby中实例变量名以“@”开头,同样每个实例变量使用前无需声明,它会在第一次使用时被动态加入到对象之中。这里的对象就是一个类的实例。我们可以这样来构造一个类的实例:

class A
    def def
        puts "def"
    end
end

a=A.new
a.def

        上面代码中,A.new就是类A的实例,a可以认为是对这个A.new实例的引用(引用的概念到后面会详细讲解)。这里引用a调用了在泪中定义的方法def。
通常在类定义的同时,也会写上一个initialize方法,该方法可以带参数,在方法中我们给实例变量赋值。
在调用new方法时,Ruby会自动调用initialize方法。
比如:

class A
    def initialize(name)
        @name = name
    end
    def name
        @name
    end
    def name=(name)
        @name = name
    end
end

a=A.new("gao")
puts a.name
a.name="li"
puts a.name

        在A这个类中,我们同时定义了name和name=方法,name用于得到@name的值,name=用于设置@name的值。之所以要这样做,是因为定义在类中的实例变量都是private的。定义name和name=方法是为了更好地使用变量@name。由于类中定义的方法,默认是public的,因此上面代码中的实例变量@name得到了很好的封装。
        为了使上面类似name和name=方法有个简写的方便,Module模块里面定义了:attr_reader,attr_writer,attr_accessor和attr方法,可以这样来使用:

class A
    attr_accessor :name, :id
end

        这段代码相当于在A中定义了下列方法:

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

        像attr_accessor用于同时使实例变量具有可读写方法一样,attr_reader、attr_writer方法分别用于使实例变量具有可读、可写方法。
Attr方法控制变量是否可读写。attr 方法有两个参数,第一个是符号参数, 第二个参数是一个 boolean 参数,用来指定是否为符号参数产生写方法。它的默认值是 false,只产生读方法,不产生写方法。比如:

class A
    attr :name, true    #读写 name和name=两个方法同时具备
    attr :id, false      #只读 只有id方法
end

4、类变量
        类变量以“@@”开头。使用前必须有定义。它在你第一次赋值的地方开始起作用。
        可以在类、模块、方法和顶层对象中加以定义。可以对类变量重新赋值。类变量默认是protected(保护)的。protected主要是用来描述继承关系的。因此在继承类中可以使用父类定义的类变量。
        实例变量是属于类的各个具体实例的,而类变量属于每个实例,事实上类变量在各个实例中只有一份。
5、特殊变量
        Ruby中有一些较为特殊的变量,我们看看下面的代码:
puts self.class     #当前的程序执行主体(方法或类)
puts nil.class      #NilClass的唯一实例
puts true.class     #TrueClass的唯一实例
puts false.class    #FalseClass的唯一实例
puts __LINE__       #当前源文件中正在执行的行号
puts __FILE__       #当前源文件名

        应该熟练掌握它们。

[[i] 本帖最后由 quzhongwei 于 2008-6-13 16:35 编辑 [/i]]

5swords 2008-6-13 16:55

能讲讲类的实例变量和局部变量的同异吗?
class A
  a = 1
  @a = 2
end

[[i] 本帖最后由 5swords 于 2008-6-13 16:58 编辑 [/i]]

libaoming 2008-6-13 17:24

局部变量主要是体现在作用域上
实例变量主要体现在实例上

neohsiao 2008-6-16 00:02

我觉得_a,局部变量用于某个局部,例如类里面
实例变量@a可以在类外通过accessor方法来取得。

wosmvp 2008-6-16 07:51

puts __LINE__   #当前源文件中正在执行的行号
puts __FILE__   #当前源文件名

这两个显示不太清楚,其实是两个 _ _
页: [1]
查看完整版本: A.5 变量和它的作用域---(2)