[RubyHackingGuide]Ruby的对象类

Ruby世界中,万物皆对象. 用Ruby"写作"时, 书写下"名词", 对这些"名词"进行修辞: 用"形容词(修饰性的名词)"丰富它们, 用"动词"让它们活泼.用OO语言来说, "对象可以拥有属性, 并响应消息".

我们知道如何用Ruby的OO语法创建类并实例化对象.但这一切是如何用C语言实现的呢?简单的说, Ruby世界中任何对象都对应C语言中的某个"变量", 而所有这些变量的类型由一些结构体(Struct)定义. 对象可修饰,可操作都是源于这些结构体.

那么来看下C中Ruby对象所对应的结构体(即所谓Ruby对象所对应的'C类', 对象类)有哪些:
# struct RObject  下面之外的所有东西  
# struct RClass 类对象
# struct RFloat 小数
# struct RString 字符串
# struct RArray 数组
# struct RRegexp 正则表达式
# struct RHash hash表
# struct RFile IO, File, Socket等等
# struct RData 所有定义在C层次上的类,除了上面提到的。
# struct RStruct Ruby的Struct类
# struct RBignum 大的整数

除了RObject, RClass, RData, RStruct外, 其它的对象类都很好理解, 例如RString这个结构体就表示了Ruby中的String类.

呵呵, 可能你也发现了错误, 是的, 在Ruby的C实现中,RString类型的变量代表Ruby中String类的实例, 但RString这个类型, 却不代表String这个Ruby类.

到此,你可能会有这样的疑问: 为什么RString类型的变量对应Ruby对象, RString却不是Ruby对象的类型---Ruby类, 的对应呢? 什么样的C结构才是Ruby类所对应的呢?

第一个问题, 万物皆对象, Ruby类也是一种对象, 换句话说, 你可以在运行时操纵Ruby类, 它可以像普通对象那样, 编辑属性, 接受消息.因此, 如果用C的类型(Struct)和变量直接对应Ruby的类和实例是不妥当的:你无法在运行时操纵C的类型(Struct)!

那么, Ruby类作为对象, 所对应的C结构体('类'对象类)是什么呢? '类'对象是对象的一种, '类'对象类也应该是对象类的一种. 是的, 其实你已经看到了Ruby类作为对象,所对应的C结构体----RClass.

上述的对象类,并没有包含所有的Ruby对象, 例如小整数, 符号, true, false, nil.这方面的知识, 请参见C层面上"指向/引用"一切ruby对象的"指针"类型[url=http://winteen.iteye.com/admin/blogs/426622]VALUE[/url].

一般意义上的Ruby对象, 在C层面上是一个对象类(除RClass)类型的变量, 那么它们在Ruby层面上响应它们的Ruby类所定义的那一套方法, 又是如何实现的呢? 换句话说, 对象类到底是如何既分离了Ruby对象的实现,又让它们具有Ruby层次上定义的类型(接口)呢?关于这一点, 请先参见[url=http://winteen.iteye.com/admin/blogs/427268]RBasic[/url].

内建的Ruby类(String, Hash, 或Fixnum这种没有真正对象类的)和用户自定义的对象类在C层面上都是一个RClass类型的变量. 在Ruby层面, 不同的类定义不同的方法, 变量, 那么这一点是如何在C层面实现的呢? 请参见[url]RClass[/url].
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值