首先,在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的了.
分享到:
相关推荐
类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范
主要介绍了Ruby中类变量和实例变量的比较,本文讲解了4点类变量和实例变量的不同之处,并给出了代码实例,需要的朋友可以参考下
Ruby中的变量有几种形式,分别是局部变量、实例变量、类变量、全局变量,对于初学者来说,常常容易搞混,尤其像本人这种做java的,理解起来还是头痛,经过仔细辨别学习,将这几种变量的差异及使用场景总结如下: ...
主要介绍了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 ...
@开头:实例变量(Instance variable)。 @@开头:类变量(Class variable)类变量被共享在整个继承链中 大写字母开头:常数(Constant)。 Ruby 全局变量 全局变量以 $ 开头。未初始化的全局变量的值为 nil,在...
Ruby 文件的输入与输出 Ruby 提供了一整套 I/O 相关的方法,在内核(Kernel)模块中实现。所有的 I/O 方法派生自 IO 类。 类 IO 提供了所有基础的方法,比如 read、 write、 gets、 puts、 readline、 getc 和 ...
实例变量实验室 目标 定义实例变量。 区分实例变量和局部变量。 描述实例变量如何赋予对象属性和属性。 概述 当我们通过自己的类构建对象时,我们知道可以通过实例方法向对象添加行为。 但是,我们如何为对象提供...
6. 变量命名约定,如局部变量、常量、实例变量、类变量等。 7. 方法命名约定,如?结尾表示返回布尔值,!结尾表示会修改对象。 8. 块(Block)的概念及使用方式,用于扩展方法功能。 9. 迭代器的使用方式,如each, ...
一些与类和实例变量交互的方法已经存在: Module#class_variable_defined? Module#class_variable_get Module#class_variable_set Object#instance_variable_defined? Object#instance_variable_get Object#...
即使是一个类本身是一个对象,它是Class类的一个实例。本章将通过所有功能涉及到Ruby的面向对象。 类是用来指定对象的形式,它结合了数据表示和方法操纵这些数据,转换成一个整齐的包。在一个类的数据和方法,被称为...
ruby语言跟c#的一些重要差别在于: 1.ruby是动态语言,c#是静态语言–即对象在new出来以后,ruby还可以动态... …其它地方,等学习深入了再写出来 最后上一段测试代码,展示了ruby中类的基本用法: 代码如下: class Peop
§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 User’s Guide的简体中文版本:Ruby用户指南。 本指南基于Mark Slagell的英文译本翻译而来,指南最初的版本由Ruby...实例变量 局部变量 类常量 异常处理:rescue 异常处理:ensure 访问器 对象初始化
在这个范围内的整数是类 Fixnum 的对象,在这个范围外的整数存储在类 Bignum 的对象中。 您可以在整数前使用一个可选的前导符号,一个可选的基础指标(0 对应 octal,0x 对应 hex,0b 对应 binary),后跟一串数字。...
创建类: class后跟...在c#中的域,在ruby中称为实例变量,定义时前边加@前缀,表示是一个实例变量。 代码如下: class Customer def initialize(name,age) @name,@age=name,age end end c1=Customer.