ruby三日游之后(一)——Ruby对象的一次探索
来源:互联网 发布:海龙设计软件多少钱 编辑:程序博客网 时间:2024/05/02 08:12
ruby三日ruby对象
目录(?)[+]
来自Ruby世界似乎是这样说的,“Ruby内一切都是对象”。
有趣的一切都是对象,那么一切也就没有不再是对象了?
"面向对象的设计方法是在结构化编程对控制流程实现了结构化后,又加上了对数据的结构化。"——《松本行弘的程序世界》
这里引用自《Ruby Hacking Guide》的对象一章的说法,对象存在的必要条件
- 能够区分自身与其它(拥有标识)
- 能够响应请求(方法)
- 保持内部状态(实例变量)
Ruby 中的类层次结构
然后我们再看看一个有意思的结果:
- irb(main):022:0> Object.class
- => Class
- irb(main):023:0> Object.superclass
- => BasicObject
- irb(main):024:0> BasicObject.superclass
- => nil
- irb(main):025:0>
这里使用的是1.9.3版本的ruby,于是这是Ruby的类层次结构,至于为什么是这样的,不凡看看下面的这些代码。
- void
- Init_class_hierarchy(void)
- {
- rb_cBasicObject = boot_defclass("BasicObject", 0);
- rb_cObject = boot_defclass("Object", rb_cBasicObject);
- rb_cModule = boot_defclass("Module", rb_cObject);
- rb_cClass = boot_defclass("Class", rb_cModule);
- rb_const_set(rb_cObject, rb_intern("BasicObject"), rb_cBasicObject);
- RBASIC_SET_CLASS(rb_cClass, rb_cClass);
- RBASIC_SET_CLASS(rb_cModule, rb_cClass);
- RBASIC_SET_CLASS(rb_cObject, rb_cClass);
- RBASIC_SET_CLASS(rb_cBasicObject, rb_cClass);
- }
这是用于初化化类层次的代码,也就是hierarchy的意思,层次,层次结构。
至于,boot_defclass那么就看看下面的
- static VALUE
- boot_defclass(const char *name, VALUE super)
- {
- VALUE obj = rb_class_boot(super);
- ID id = rb_intern(name);
- rb_name_class(obj, id);
- rb_const_set((rb_cObject ? rb_cObject : obj), id, obj);
- return obj;
- }
原文是这么长:
- #if defined HAVE_UINTPTR_T && 0
- typedef uintptr_t VALUE;
- typedef uintptr_t ID;
- # define SIGNED_VALUE intptr_t
- # define SIZEOF_VALUE SIZEOF_UINTPTR_T
- # undef PRI_VALUE_PREFIX
- #elif SIZEOF_LONG == SIZEOF_VOIDP
- typedef unsigned long VALUE;
- typedef unsigned long ID;
- # define SIGNED_VALUE long
- # define SIZEOF_VALUE SIZEOF_LONG
- # define PRI_VALUE_PREFIX "l"
- #elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
- typedef unsigned LONG_LONG VALUE;
- typedef unsigned LONG_LONG ID;
- # define SIGNED_VALUE LONG_LONG
- # define LONG_LONG_VALUE 1
- # define SIZEOF_VALUE SIZEOF_LONG_LONG
- # define PRI_VALUE_PREFIX PRI_LL_PREFIX
- #else
- # error ---->> ruby requires sizeof(void*) == sizeof(long) or sizeof(LONG_LONG) to be compiled. <<----
- #endif
那么,简化一下为和前几个版本一致的,那么就是
- typedef unsigned long VALUE;
Ruby的对象变的
让我们再简单看一看一个示例
- irb(main):025:0> 1.class
- => Fixnum
- irb(main):026:0> Fixnum.class
- => Class
- irb(main):027:0> Fixnum.superclass
- => Integer
- irb(main):028:0> Fixnum.superclass.superclass
- => Numeric
- irb(main):029:0> Fixnum.superclass.superclass.superclass
- => Object
- irb(main):030:0> Fixnum.superclass.superclass.superclass.superclass
- => BasicObject
- irb(main):031:0>
因为这些都已经改变了
原先的对象只有这些
- #define R_CAST(st) (struct st*)
- #define RBASIC(obj) (R_CAST(RBasic)(obj))
- #define ROBJECT(obj) (R_CAST(RObject)(obj))
- #define RCLASS(obj) (R_CAST(RClass)(obj))
- #define RMODULE(obj) RCLASS(obj)
- #define RFLOAT(obj) (R_CAST(RFloat)(obj))
- #define RSTRING(obj) (R_CAST(RString)(obj))
- #define RREGEXP(obj) (R_CAST(RRegexp)(obj))
- #define RARRAY(obj) (R_CAST(RArray)(obj))
- #define RHASH(obj) (R_CAST(RHash)(obj))
- #define RDATA(obj) (R_CAST(RData)(obj))
- #define RSTRUCT(obj) (R_CAST(RStruct)(obj))
- #define RBIGNUM(obj) (R_CAST(RBignum)(obj))
- #define RFILE(obj) (R_CAST(RFile)(obj))
- #define R_CAST(st) (struct st*)
- #define RBASIC(obj) (R_CAST(RBasic)(obj))
- #define ROBJECT(obj) (R_CAST(RObject)(obj))
- #define RCLASS(obj) (R_CAST(RClass)(obj))
- #define RMODULE(obj) RCLASS(obj)
- #define RFLOAT(obj) (R_CAST(RFloat)(obj))
- #define RSTRING(obj) (R_CAST(RString)(obj))
- #define RREGEXP(obj) (R_CAST(RRegexp)(obj))
- #define RARRAY(obj) (R_CAST(RArray)(obj))
- #define RHASH(obj) (R_CAST(RHash)(obj))
- #define RDATA(obj) (R_CAST(RData)(obj))
- #define RTYPEDDATA(obj) (R_CAST(RTypedData)(obj))
- #define RSTRUCT(obj) (R_CAST(RStruct)(obj))
- #define RBIGNUM(obj) (R_CAST(RBignum)(obj))
- #define RFILE(obj) (R_CAST(RFile)(obj))
- #define RRATIONAL(obj) (R_CAST(RRational)(obj))
- #define RCOMPLEX(obj) (R_CAST(RComplex)(obj))
Ruby 不变的对象
让我们看看结构化的那部分
- struct RBasic {
- VALUE flags;
- const VALUE klass;
- }
以及Object
- struct RObject {
- struct RBasic basic;
- union {
- struct {
- long numiv;
- VALUE *ivptr;
- struct st_table *iv_index_tbl; /* shortcut for RCLASS_IV_INDEX_TBL(rb_obj_class(obj)) */
- } heap;
- VALUE ary[ROBJECT_EMBED_LEN_MAX];
- } as;
- };
还有Rstring
- struct RString {
- struct RBasic basic;
- union {
- struct {
- long len;
- char *ptr;
- union {
- long capa;
- VALUE shared;
- } aux;
- } heap;
- char ary[RSTRING_EMBED_LEN_MAX + 1];
- } as;
- };
于是让我们回到
对象存在的必要条件
- 能够区分自身与其它(拥有标识)
- 能够响应请求(方法)
- 保持内部状态(实例变量)
- struct RBasic {
- VALUE flags;
- const VALUE klass;
- }
- flags是个多目的的标记,大多用以记录结构体的类型。
- klass包含了这个对象归属的类。
- struct RFloat {
- struct RBasic basic;
- double float_value;
- };
- ruby三日游之后(一)——Ruby对象的一次探索
- ruby三日游之后(一)——Ruby对象的一次探索
- ruby三日游之后(二)——Sinatra RESTful初入
- 【Ruby】Ruby(面向对象程序设计的脚本语言)入门
- 一个python程序员的ruby三日游(二)——第一天 ruby rspec
- Ruby的对象模型
- 一个python程序员的ruby三日游(五) ——重构(一)
- 一个python程序员的ruby三日游(五) ——重构(一)
- Ruby 学习笔记一(Ruby 安装)
- Ruby 语法(一)
- Ruby 教程(一)
- ruby札记(一)
- Ruby 基础知识(一)
- Ruby基础(一)
- 一个python程序员的ruby三日游(一)
- ruby元编程——对象模型
- 【Ruby】Ruby的model学习——Active Record Associations
- ruby学习笔记(一)——初学者教程
- 关于“分贝”单位的介绍,比百度讲的明白多了
- 黑马程序员_枚举
- NSJSONSerialization-JSON数据与NSDictionary和NSArray之间的转化
- 什么是百度竞价创意断句符
- eclipse安装插件pydev
- ruby三日游之后(一)——Ruby对象的一次探索
- 程序员面试之性格篇
- 在WinForm和WPF中使用GMap.Net地图插件简单教程
- Python装饰器及functools模块
- 代码优化篇
- [perl]支持ipv6-icmp ping
- VS2010初学
- poj 3181 Dollar Dayz
- 【九度】题目1167:数组排序