莊周夢(mèng)蝶

          生活、程序、未來(lái)
             :: 首頁(yè) ::  ::  :: 聚合  :: 管理
              讀完ruby hacking guide第6章,徹底總結(jié)下:
          1.在Ruby中,類也是一個(gè)對(duì)象,因此有實(shí)例變量。類的實(shí)例變量、類變量、常量都是存儲(chǔ)在RClass struct的iv_tbl中,
          struct RClass {
              struct RBasic basic;
              struct st_table *iv_tbl;
              struct st_table *m_tbl;
              VALUE super;
          };
          iv_tbl的類型是st_table,我在這里用java實(shí)現(xiàn)了一下。

          2.用戶自定義類的對(duì)象(ruby層次聲明的類的對(duì)象)的實(shí)例變量存儲(chǔ)在RObject struct的iv_tbl中,
          struct RObject {
            struct RBasic basic;
            struct st_table *iv_tbl;
           };
          調(diào)用方法,本質(zhì)上是一個(gè)查表操作。buildin的幾個(gè)類,比如String、Array、Hash等(在c層次上實(shí)現(xiàn)的類),它們的結(jié)構(gòu)并沒(méi)有iv_table,這是從節(jié)省內(nèi)存空間的角度考慮,它們的實(shí)例變量存儲(chǔ)在一張全局的st_table中。這張表比較特別,其中的每一個(gè)對(duì)應(yīng)的值又是一個(gè)st_table,也就是一個(gè)“二元結(jié)構(gòu)”,第一層結(jié)構(gòu)是類名與實(shí)例變量表的映射,第二層才是實(shí)例變量名與實(shí)際值的映射。

          3.全局變量存儲(chǔ)在一張全局的st_table中,這個(gè)表的鍵就是變量名ID,由于全局變量允許通過(guò)alias來(lái)設(shè)置別名,因此這張全局表中真正存儲(chǔ)的是下面這個(gè)struct

          334 struct global_entry {
          335 struct global_variable *var;
          336 ID id;
          337 };

          324 struct global_variable {
          325 int counter; /* 引用計(jì)數(shù) */
          326 void *data; /* 變量值 */
          327 VALUE (*getter)(); /* 取值函數(shù) */
          328 void (*setter)(); /* 設(shè)置函數(shù) */
          329 void (*marker)(); /* 標(biāo)記函數(shù) */
          330 int block_trace;
          331 struct trace_var *trace;
          332 };
          (variable.c)

          當(dāng)不同變量名(通過(guò)別名聲明)指向的是同一個(gè)全局變量,其實(shí)它們指向的是同一個(gè)struct global_variable。


          主站蜘蛛池模板: 渝北区| 巴东县| 庐江县| 亚东县| 仙桃市| 塔河县| 正镶白旗| 嵩明县| 登封市| 灵台县| 漠河县| 稷山县| 阳春市| 金沙县| 安龙县| 宁陕县| 桃源县| 安吉县| 和平区| 息烽县| 大埔县| 黎城县| 嘉黎县| 明光市| 观塘区| 遂宁市| 包头市| 舟曲县| 赣榆县| 丹江口市| 塔城市| 白银市| 扶沟县| 涪陵区| 呼图壁县| 民县| 合山市| 南充市| 犍为县| 渑池县| 大悟县|