一个程序引起的思考
2010-08-24 23:18
288 查看
在ruby里,每一个类都有一个Metaclass。除了Metaclass之外,所有的Object都是instance object.
换言之,在ruby里,你所有能看见的object都是实例。
首先,在ruby中,如何知道一个object是一个类还是这个类的实例呢?很简单,如果有object的klass指向它,那么他就是我们传统所说的'类', 而如果一个object的klass指向别人那么就是传统所说的'实例'. 为什么要加传统呢?因为在ruby里,一个object即可以是'类',也可以是'实例'。也就是说既有一个object的klass指向它,而它的klass又指向别人。所以即使是传统意义的'类',也是metaclass的实例。而metaclass是不可见的,所以在ruby里所有的object都是一个'实例', 只有metaclass才是真正的纯'类'。这不禁让我觉得以往面向对象里所定义的'类','实例'在ruby面前被扭曲了,甚至觉得词汇定义的贫乏。
具体的关系可以看下图:
知道了这个,那么就很好理解
因为这里@v1是T1这个实例的变量,而不是ins1这个实例的变量,这是两个完全不相干的实例,如果我不追加定义self.get_v1的话T1里根本就没有get_v1这个方法,所以你调用T1.get_v1是错误的。
换言之,在ruby里,你所有能看见的object都是实例。
首先,在ruby中,如何知道一个object是一个类还是这个类的实例呢?很简单,如果有object的klass指向它,那么他就是我们传统所说的'类', 而如果一个object的klass指向别人那么就是传统所说的'实例'. 为什么要加传统呢?因为在ruby里,一个object即可以是'类',也可以是'实例'。也就是说既有一个object的klass指向它,而它的klass又指向别人。所以即使是传统意义的'类',也是metaclass的实例。而metaclass是不可见的,所以在ruby里所有的object都是一个'实例', 只有metaclass才是真正的纯'类'。这不禁让我觉得以往面向对象里所定义的'类','实例'在ruby面前被扭曲了,甚至觉得词汇定义的贫乏。
具体的关系可以看下图:
知道了这个,那么就很好理解
class T1 @v1 = 'abc' def get_v1 return @v1 end def self.get_v1 return @v1 end end i1 = T1.new puts i1.get_v1 #返回空,而不是'abc' puts T1.get_v1 #这个才是返回'abc'
因为这里@v1是T1这个实例的变量,而不是ins1这个实例的变量,这是两个完全不相干的实例,如果我不追加定义self.get_v1的话T1里根本就没有get_v1这个方法,所以你调用T1.get_v1是错误的。
相关文章推荐
- 一个精典asp程序引发的错误引起的思考
- 一个串口程序引起的思考
- 一个基本类型在方法中修改引起的思考
- 一个在校大学生和我的Email交流,希望能引起共鸣和思考~~纯属交流~~
- for语句引起一个死循环而引发的思考!!!
- 一个按键程序的思考
- 由程序部署所引起的思考 推荐
- 移动项目开发笔记(一个用户控件引起对asp.net 2.0编译的思考)
- 对一个程序的思考3(移位操作之移动负数位)
- 一个BUG引起的思考
- 将链表逆序排列的一个程序及思考的对链表依某一元素排序方法
- 一个类型转换而引起的三级事件的一些思考
- 一个困惑引起的思考
- 对一个程序的思考5(C++各种函数调用)
- 有一个笑话引起的思考
- 一个lua代码中的bug引起的思考:不要被c++ crash堆栈误导
- 对异常处理中的一个问题的思考(出现异常,程序仍能继续运行)
- 专业的程序员需要具备的思考能力:写一个程序需要注意多少细节问题
- 一个网站直接跳转引起的一些思考
- 关于前两天的一个比较复杂的程序逻辑的思考