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

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

3、实例变量
    在php?name=Ruby" onclick="tagshow(event)" class="t_tag">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__   #当前源文件名

    应该熟练掌握它们。

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

[ 本帖最后由 5swords 于 2008-6-13 16:58 编辑 ]
局部变量主要是体现在作用域上
实例变量主要体现在实例上
我觉得_a,局部变量用于某个局部,例如类里面
实例变量@a可以在类外通过accessor方法来取得。
puts __LINE__ #当前源文件中正在执行的行号
puts __FILE__ #当前源文件名

这两个显示不太清楚,其实是两个 _ _