Ruby原始碼分析(struct)

2021-06-20 15:34:42 字數 2586 閱讀 2336

2012-01-08 - hhuai

struct rbasic ;

struct robject ;

struct rclass ;

以前研究過jvm, 再看看動態語言原理都差不多。

和jvm一樣,其中存著兩個必須的東西,變數表(iv_tbl)和方法表(m_tbl)。 

這裡的變數表應該是只包含類變數(我不確定) 

super表示父類。

其中為什麼要包含乙個變數表而不需要方法表呢, 

因為方法表是每個例項可以共用的, 

而變數確是每個例項自己擁有的。

其他所有的東東都繼承於他,裡面包含乙個klass,就是指向的類結構(rclass) 

這樣所有的東西都是對像了。

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(...) ruby kernel

p(obj) → obj p(obj1, obj2, ...) → [obj, ...] p() → nil

static value

rb_f_p(int argc, value *argv, value self)

可以看到p是在kernel中定義的,實現方式是純c的內部實現。 

注(原始碼中搜搜,發現是沒有kernel.c這樣的**檔案的,kernel的定義全在object.c中的init_object函式中。) 

根據rb_f_p一路往下跟,在io.c中的5958行可以看到如下語句:

rb_define_global_function("p", rb_f_p, -1);
從句面意思看,就是把p和rb_f_p關聯,再定義為乙個全域性方法。繼續往下走, 

看rb_define_global_function的實現,只有一句話。

rb_define_module_function(rb_mkernel, name, func, argc)
rb_mkernel就是kernel模組,初始化實現在object.c中. 

到這裡其實大至就已經明白了,要定義乙個所謂的全域性函式,就在kernel模組中定義函式。 

當然這個函式應該是c的實現,在object初始化時載入進去。 

按這個道理推一下,我們應該能這樣呼叫

object#p

ruby-1.9

.2-p290

:001 > "".p "haha"

nomethoderror: private method \`p called for "":string

會報錯,那麼繼續往下再看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進去。 

既然是私有方法,又是單例方法,那可以這麼調

"".send(:p, "haha") #輸出haha,呼叫成功了

kernel.p 'haha'

#也可成功

那麼在irb中為什麼能呼叫object的私有方法呢,看網上有資料說是有隱含的self呼叫 

和在類中一樣的,私有方法,只有隱式self才能呼叫,例:

class a

def f; p1; end #隱式self

def f1; self.p1; end #顯式self

private

def p1; 'p1'; end

enda.new.f #輸出p1

a.new.f1 #錯誤,private方法不能呼叫

所以直接寫p可以成功呼叫,而self.p卻不行 

先分析到這,有時間繼續挖。

Ruby原始碼分析

struct rbasic struct robject struct rclass 以前研究過jvm,再看看動態語言原理都差不多。和jvm一樣,其中存著兩個必須的東西,變數表 iv tbl 和方法表 m tbl 這裡的變數表應該是只包含類變數 我不確定 super表示父類。其中為什麼要包含乙個變數...

ruby 0 49原始碼分析

今天想想,讀讀ruby0.49的原始碼。用c寫東西,那是太慢了。真要幹活,還是用perl或者ruby.現在時間充足,就相看看ruby0.49。收到了王亞剛寫的gcc原始碼分析的書,他的版本太高,感覺還是讀最古老的版本較划算。量太大了,這何年何月才能看完呢。wget tar zxvf ruby 0.4...

ruby0 49 regex c原始碼分析

ruby0.49 regex.c原始碼分析 網上買個日本人的二手顯示器,保護眼睛吧。安裝好顯示器就開始讀原始碼。看regex.c,因為可以單獨進行測試,先加上幾句 define test 1 include include 進行編譯時,報錯,說xmalloc,xrealloc等函式找不到,網上也找不...