Ruby中的变量有几种形式,分别是局部变量、实例变量、类变量、全局变量,对于初学者来说,常常容易搞混,尤其像本人这种做java的,理解起来还是头痛,经过仔细辨别学习,将这几种变量的差异及使用场景总结如下:

一、命名方式

局部变量

实例变量

类变量    

全局变量


二、作用范围

局部变量

class Account
	user=User.new
	def myMethod
		puts user.name   #调用发生错误,user未定义
	end
end


实例变量   如@user,有点类似于java中POJO类的成员变量,类中随意访问,类外通过方法访问,作用于本实例对象范围内或本类的实例对象范围内(这句话有点绕口,请注意分清楚类对象本身[Account,是Class类的一个对象]和 类实例化后的对象[Account.new,是Account类的一个对象]),这是两个相互独立的域,定义在Account中的变量不能在Account.new中访问,反之亦然,如下边示例代码

class A  
  #类的类实例变量在访问前可以赋值也可以不赋值,不赋值就是nil  
  @alpha='This is @alpha\' value!' 
  
  def A.look
  	puts "#@alpha"  
  end
  def look  
  	puts "#@alpha"  
  end
end  

A.look        #输出:'This is @alpha' value!''
A.new.look    #输出:''

再看如下代码:

class A  
  #类的类实例变量在访问前可以赋值也可以不赋值,不赋值就是nil  
  @alpha='This is @alpha\' value!' 

  def A.look
  	puts "#@alpha"  
  end
  def look 
  	@alpha='This is @alpha\' value from look!' 
  	puts "#@alpha"  
  end
  def look_again  
  	puts "#@alpha"  
  end
end  

A.look        #输出:'This is @alpha' value!''
a=A.new
a.look        #输出:'This is @alpha' value from look!'
a.look_again  #输出:'This is @alpha' value from look!'

可见,

@alpha='This is @alpha\' value!'是定义在类对象本身的实例变量, @alpha='This is @alpha\' value from look!'是定义在类实例化后的对象中的实例变量,另外,使用实例变量时还应该注意一下几点:

1、实例变量不管是在类中定义,还是在方法中定义,其都属于类,而不是方法

2、实例变量只存在于实例范围,不可在子类中引用或者赋值

3、实例变量永远都是Private的,不能暴露为Public,外部访问通过方法进行,可以使用attr_accessor简便定义

类变量    

class A  
  #类的类实例变量在访问前可以赋值也可以不赋值,不赋值就是nil  
  @@alpha='This is @alpha\' value!' 

  def A.look
  	puts "#@@alpha"  
  end
  def look 
  	puts "#@@alpha"  
  end
  def look_again  
  	puts "#@@alpha"  
  end
end  

class B<A
end

A.look        #输出:'This is @alpha' value!'
B.look        #输出:'This is @alpha' value!'
a=A.new
a.look        #输出:'This is @alpha' value!'
a.look_again  #输出:'This is @alpha' value!'
b=B.new
b.look        #输出:'This is @alpha' value!'
b.look_again  #输出:'This is @alpha' value!'


全局变量    如$user,尽量少使用 ,作用于整个程序的生命周期,常驻内存,过量使用会引起性能下降,内存溢出,Ruby内置一些全局变量,获取相关数据十分方便,如$0’代表的是所运行应用程序的文件名称,‘$:’代表的是默认的文件搜索路径;'$$'代表的是 ruby 程序的进程 id