`
simohayha
  • 浏览: 1384379 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

ruby中的类变量与类实例变量

    博客分类:
  • ruby
阅读更多
首先,在ruby1.8中类变量是所有子类和父类共享的,可以看下面的代码:

class IntelligentLife  
  @@home_planet = nil
  
  def self.home_planet
    @@home_planet
  end
  def self.home_planet=(x)
    @@home_planet = x
  end
  #...
end
class Terran < IntelligentLife
  @@home_planet = "Earth"
end

class Martian < IntelligentLife
  @@home_planet = "Mars"
end


p IntelligentLife.home_planet
p Terran.home_planet
p Martian.home_planet


可以看到结果是相同的,都是"Mars".这是因为父类的类变量是被整个继承体系所共享的.

在这里我们如果想要得到我们所需要的结果,我们就要使用类实例变量,因为类实例变量是严格的per-class。而不是被整个继承体系所共享。

class IntelligentLife  
  @home_planet = nil
  
 class << self
    attr_accessor :home_planet
  end
end
class Terran < IntelligentLife
  @home_planet = "Earth"
end

class Martian < IntelligentLife
  @home_planet = "Mars"
end


p IntelligentLife.home_planet
p Terran.home_planet
p Martian.home_planet



而在1.9中,类变量不再被继承体系所共享。也就是和java中的静态变量差不多了。

下面的代码在1.9中运行.

class IntelligentLife  
  @@home_planet = "bobo"
  def self.home_planet
    @@home_planet
  end
end
class Terran < IntelligentLife
  @@home_planet = "Earth" 
end

class Martian < IntelligentLife
  @@home_planet = "Mars"
  def self.home_planet
    @@home_planet
  end
end


p IntelligentLife.home_planet
p Terran.home_planet
p Martian.home_planet


可以看到这时的类变量才是真正的类变量,也就是说是per-class的了.





1
3
分享到:
评论
1 楼 itiProCareer 2014-06-01  
简直胡说八道,误人子弟啊。。。。谁告诉你 Ruby 1.9 后类变量不再被继承体系所共享???????

相关推荐

    类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范

    类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范

    Ruby中类变量和实例变量的比较

    主要介绍了Ruby中类变量和实例变量的比较,本文讲解了4点类变量和实例变量的不同之处,并给出了代码实例,需要的朋友可以参考下

    Ruby中的变量学习总结

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

    Ruby类实例变量、类实例方法和类变量、类方法的区别

    主要介绍了Ruby类实例变量、类实例方法和类变量、类方法的区别,本文探讨一下他们的定义和基本的使用场景,需要的朋友可以参考下

    实例讲解Ruby中的五种变量

    下面的实例显示了全局变量的用法。 #!/usr/bin/ruby $global_variable = 10 class Class1 def print_global puts Global variable in Class1 is #$global_variable end end class Class2 def print_global ...

    深入分析Ruby 变量

    @开头:实例变量(Instance variable)。 @@开头:类变量(Class variable)类变量被共享在整个继承链中 大写字母开头:常数(Constant)。 Ruby 全局变量 全局变量以 $ 开头。未初始化的全局变量的值为 nil,在...

    Ruby 文件的输入与输出

    Ruby 文件的输入与输出 Ruby 提供了一整套 I/O 相关的方法,在内核(Kernel)模块中实现。所有的 I/O 方法派生自 IO 类。 类 IO 提供了所有基础的方法,比如 read、 write、 gets、 puts、 readline、 getc 和 ...

    ruby oo基础知识实例变量实验室

    实例变量实验室 目标 定义实例变量。 区分实例变量和局部变量。 描述实例变量如何赋予对象属性和属性。 概述 当我们通过自己的类构建对象时,我们知道可以通过实例方法向对象添加行为。 但是,我们如何为对象提供...

    Ruby菜鸟入门指南.md

    6. 变量命名约定,如局部变量、常量、实例变量、类变量等。 7. 方法命名约定,如?结尾表示返回布尔值,!结尾表示会修改对象。 8. 块(Block)的概念及使用方式,用于扩展方法功能。 9. 迭代器的使用方式,如each, ...

    variables:类和实例变量的“变量”对象

    一些与类和实例变量交互的方法已经存在: Module#class_variable_defined? Module#class_variable_get Module#class_variable_set Object#instance_variable_defined? Object#instance_variable_get Object#...

    进一步深入Ruby中的类与对象概念

    即使是一个类本身是一个对象,它是Class类的一个实例。本章将通过所有功能涉及到Ruby的面向对象。 类是用来指定对象的形式,它结合了数据表示和方法操纵这些数据,转换成一个整齐的包。在一个类的数据和方法,被称为...

    ruby 学习笔记(2) 类的基本使用

    ruby语言跟c#的一些重要差别在于: 1.ruby是动态语言,c#是静态语言–即对象在new出来以后,ruby还可以动态... …其它地方,等学习深入了再写出来 最后上一段测试代码,展示了ruby中类的基本用法: 代码如下: class Peop

    ruby语法基础教程

    §3.5 类变量与类方法 23 §3.4 存取控制 23 §3.6 元类 25 §3.7 Ruby的动态性 26 §3.8 变量 26 §3.8.1 局部变量 27 §3.8.2 实例变量 27 §3.8.3 类变量 27 §3.8.4 全局变量 28 §3.8.5 常量 28 §3.8 与定义...

    非常好的Ruby中文版项目资源,分享出来.zip

    这是 Ruby User’s Guide的简体中文版本:Ruby用户指南。 本指南基于Mark Slagell的英文译本翻译而来,指南最初的版本由Ruby...实例变量 局部变量 类常量 异常处理:rescue 异常处理:ensure 访问器 对象初始化

    实例解析Ruby中的数值类型以及常量

    在这个范围内的整数是类 Fixnum 的对象,在这个范围外的整数存储在类 Bignum 的对象中。 您可以在整数前使用一个可选的前导符号,一个可选的基础指标(0 对应 octal,0x 对应 hex,0b 对应 binary),后跟一串数字。...

    Ruby基础知识之类

    创建类: class后跟...在c#中的域,在ruby中称为实例变量,定义时前边加@前缀,表示是一个实例变量。 代码如下: class Customer  def initialize(name,age)  @name,@age=name,age  end end   c1=Customer.

Global site tag (gtag.js) - Google Analytics