Ruby源码分析
- 首先看一下RClass, RObject, RBasicObject之間的關系
以前研究過jvm, 再看看動態語言原理都差不多。
- RClass 表示的是一個類結構。
和jvm一樣,其中存著兩個必須的東西,變量表(iv_tbl)和方法表(m_tbl)。?
這里的變量表應該是只包含類變量(我不確定)?
super表示父類。
- RObject 表示是一個類實例對像。
其中為什么要包含一個變量表而不需要方法表呢,?
因為方法表是每個實例可以共用的,?
而變量確是每個實例自己擁有的。
- RBasic是一個公共基類
其他所有的東東都繼承于他,里面包含一個klass,就是指向的類結構(RClass)?
這樣所有的東西都是對像了。
- RObject
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 大的整數
其他的一些類,都是常用類,Ruby將其native化了,和jvm里的一些類是一樣的道理。
- 關于全局函數
理論上來說,純面向對象是不應該存在全局函數,但是Ruby中可以直接調用p,puts這些方法。?
(按阿勇的解釋一路分析下去)?
在rdoc中查看p函數的定義
可以看到p是在Kernel中定義的,實現方式是純c的內部實現。?
注(源碼中搜搜,發現是沒有Kernel.c這樣的代碼文件的,kernel的定義全在object.c中的Init_Object函數中。)?
根據rb_f_p一路往下跟,在io.c中的5958行可以看到如下語句:
從句面意思看,就是把p和rb_f_p關聯,再定義為一個全局方法。繼續往下走,?
看rb_define_global_function的實現,只有一句話。
rb_mKernel就是Kernel模塊,初始化實現在object.c中.?
到這里其實大至就已經明白了,要定義一個所謂的全局函數,就在Kernel模塊中定義函數。?
當然這個函數應該是c的實現,在Object初始化時加載進去。?
按這個道理推一下,我們應該能這樣調用
會報錯,那么繼續往下再看rb_define_module_function的實現
rb_define_private_method(rb_mKernel, name, func, argc); rb_define_singleton_method(rb_mKernel, name, func, argc); 先定義成私方法,再定義成單例方法。?
所謂的rb_define_private_method,rb_define_protected_method都是調用rb_add_method,只是標志位不一樣。?
rb_undef_method其實也是,只是傳參時將綁定的方法傳NULL進去。?
既然是私有方法,又是單例方法,那可以這么調
那么在irb中為什么能調用Object的私有方法呢,看網上有資料說是有隱含的self調用?
和在類中一樣的,私有方法,只有隱式self才能調用,例:
所以直接寫p可以成功調用,而self.p卻不行?
先分析到這,有時間繼續挖。
總結
- 上一篇: SQLite学习(三) - SQLite
- 下一篇: 代码分析:NASM源码阅读笔记