Ruby类实例变量、类实例方法和类变量、类方法的区别
技术  /  管理员 发布于 6年前   425
在Ruby中类实例变量、类实例方法和类变量、类方法的区别比较微妙,而且用法也有相当的区别。本文探讨一下他们的定义和基本的使用场景,以抛砖引玉...
 
一.类实例变量和类变量
 
类变量大家都很熟悉了,就是在类定义中用@@开头的变量。类变量是用于存储类的全局信息,它只属于类,不同与类实例变量(即用@开头定义的变量)每一个类的对象都有一份数据。 类变量是可以被继承的,也就是说如果我们派生一个子类,那么在子类中是可以访问父类的类变量的。子类和父类共享一份数据,对一个类的修改会反映到另一个类中。如下边的代码运行结果显示:
复制代码 代码如下:
class A  
   #类变量在访问前必须赋值,否则会有"uninitialized class variable“ 错误  
  @@alpha=123                # Initialize @@alpha  
  @@beta=456                 #Initialize @@beta  
  @@gamma=789              #Initialize @@gamma  
   
  def A.alpha  
    @@alpha  
  end   
   
  def A.alpha=(x)  
    @@alpha=x  
  end  
   
  def A.beta  
    @@beta  
  end  
   
  def A.beta=(x)  
     @@beta=x  
  end   
    
  def A.gamma  
   @@gamma  
  end  
   
  def A.gamma=(x)  
    @@gamma=x  
  end   
  def A.look  
    puts "#@@alpha, #@@beta, #@@gamma"  
  end  
  end  
  
  
class B<A    
end  
  
#初始的数据  
A.look  
B.look  
  
#修改父类中的类变量  
A.alpha=111  
A.look  
B.look  
  
  
运行结果:  
复制代码 代码如下:
123, 456, 789  
123, 456, 789  
111, 456, 789  
111, 456, 789  
那么什么是类的类实例变量呢?类的类实例变量是在类的类方法中或方法外边(不能在实例方法中,那是类的实例变量)以@开头定义的变量,这样定义的变量值属于类对象本身,不能够被子类继承。类对象这个说法可能有些让人疑惑,其实Ruby中的一起都是对象,我们定义的类和Ruby的内置类本身就是元类的对象。因此如果要定义需要和子类共享的类全局数据,使用类变量;但是如果要定义仅供类本身使用的类全局数据可以使用类实例变量。还有一点需要注意的是,和类变量不同的是类实例变量不要求访问前必须赋值,不赋值它的值就是nil 。我们还是看一个例子,能够更清楚一点...
 复制代码 代码如下:
class A  
   #类的类实例变量在访问前可以赋值也可以不赋值,不赋值就是nil  
  @alpha=123              # Initialize @alpha  
  @beta=456                #Initialize @beta  
  @gamma=789             #Initialize @gamma  
   
  def A.alpha  
    @alpha  
  end   
   
  def A.alpha=(x)  
    @alpha=x  
  end  
   
  def A.beta  
    @beta  
  end  
   
  def A.beta=(x)  
     @beta=x  
  end   
    
  def A.gamma  
   @gamma  
  end  
   
  def A.gamma=(x)  
    @gamma=x  
  end   
  def A.look  
    puts "#@alpha, #@beta, #@gamma"  
  end  
  end  
  
  
class B<A    
end  
  
A.look  
B.look  
代码的运行结果如下:
复制代码 代码如下:
123, 456, 789
, , 
nil
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
			Copyright·© 2019 侯体宗版权所有·
			粤ICP备20027696号
			
			
