如何取得定義類Ruby metaclass
大家通過(guò)對(duì)Ruby語(yǔ)言的深入學(xué)習(xí)可以清楚的知道,它是一款完全面向?qū)ο蟮哪_本語(yǔ)言。對(duì)于程序員來(lái)說(shuō),對(duì)象是屬于世間萬(wàn)物的。那么類呢?在這里我們就為大家講解一下Ruby metaclass這個(gè)定義類的具體含義。#t#
1 對(duì)象存儲(chǔ)數(shù)據(jù),類存儲(chǔ)方法。就是說(shuō),對(duì)象保存屬于這個(gè)對(duì)象的數(shù)據(jù),這樣每個(gè)對(duì)象間的數(shù)據(jù)是獨(dú)立的,各有各的存儲(chǔ)空間,方法在內(nèi)存中只有一份,就是由類保存。
2 什么是Ruby metaclass,簡(jiǎn)單來(lái)說(shuō)就是,首先他是一個(gè)類,他是一個(gè)特殊的類,他描述的不是人,也不是飛機(jī),是另外的一個(gè)類。
當(dāng)Ruby 處理下面代碼后,我們得到Person對(duì)象,它是Class類的實(shí)例
- class Person
- attr_accessor :age,:name
- def initialize(age,name)
- @namename = name
- @ageage = age
- end
- end
Class 也是一個(gè)對(duì)象,那么上面說(shuō)對(duì)象中只存儲(chǔ)數(shù)據(jù),那么又如何解釋呢?
只有查看Ruby的源代碼,ruby是用C語(yǔ)言寫的,里面的對(duì)象簡(jiǎn)單來(lái)說(shuō)就是一些數(shù)據(jù)結(jié)構(gòu)。
對(duì)于Class的對(duì)象,有一個(gè)m_tbl成員,從名字可見(jiàn)是一個(gè)方法表。可見(jiàn)Class對(duì)象要比一般的對(duì)象特別。
- struct RObject {
- struct RBasic basic;
- struct st_table *iv_tbl;
- };
- struct RClass {
- struct RBasic basic;
- struct st_table *iv_tbl;
- struct st_table *m_tbl;
- VALUE super;
- };
3 如何取得定義類的Ruby metaclass呢?最簡(jiǎn)單的兩個(gè)方法,類名即是這個(gè)Class的metaclass.也可以能過(guò)類實(shí)例的.class方法。
- irb(main):003:0> Person.object_id
- => -604423968
- irb(main):004:0> p = Person.new
- => #<Person:0xb7f1cb08>
- irb(main):006:0> p.class.class
- => Class
- irb(main):007:0> p.class.class.object_id
- => -604330368
- irb(main):008:0> p.class.object_id
- => -604423968
- irb(main):009:0> p.class.inspect
- => "Person"
- irb(main):010:0> p.object_id
- irb(main):011:0> p2 = Person.new
- => #<Person:0xb7ef6944>
- irb(main):012:0> p2.class.object_id
- => -604423968
如代碼所示 Person.object_id == p.class.object_id == p2.class.object_id 可以他們都是一個(gè)東西。
即 p.class == p2.class == Person 都為Person的Ruby metaclass。