如何取得定义类Rubymetaclass

大家通过对Ruby语言的深入学习可以清楚的知道,它是一款完全面向对象的脚本语言。对于程序员来说,对象是属于世间万物的。那么类呢?在这里我们就为大家讲解一下Ruby metaclass这个定义类的具体含义。#t#

1 对象存储数据,类存储方法。就是说,对象保存属于这个对象的数据,这样每个对象间的数据是独立的,各有各的存储空间,方法在内存中只有一份,就是由类保存。

2 什么是Ruby metaclass,简单来说就是,首先他是一个类,他是一个特殊的类,他描述的不是人,也不是飞机,是另外的一个类。

当Ruby 处理下面代码后,我们得到Person对象,它是Class类的实例

 
 
 
  1. class Person
  2. attr_accessor :age,:name
  3. def initialize(age,name)
  4. @namename = name
  5. @ageage = age
  6. end
  7. end

Class 也是一个对象,那么上面说对象中只存储数据,那么又如何解释呢?

只有查看Ruby的源代码,ruby是用C语言写的,里面的对象简单来说就是一些数据结构。

对于Class的对象,有一个m_tbl成员,从名字可见是一个方法表。可见Class对象要比一般的对象特别。

 
 
 
  1. struct RObject {
  2. struct RBasic basic;
  3. struct st_table *iv_tbl;
  4. };
  5. struct RClass {
  6. struct RBasic basic;
  7. struct st_table *iv_tbl;
  8. struct st_table *m_tbl;
  9. VALUE super;
  10. };

3 如何取得定义类的Ruby metaclass呢?最简单的两个方法,类名即是这个Class的metaclass.也可以能过类实例的.class方法。

 
 
 
  1. irb(main):003:0> Person.object_id
  2. => -604423968
  3. irb(main):004:0> p = Person.new
  4. => #
  5. irb(main):006:0> p.class.class
  6. => Class
  7. irb(main):007:0> p.class.class.object_id
  8. => -604330368
  9. irb(main):008:0> p.class.object_id
  10. => -604423968
  11. irb(main):009:0> p.class.inspect
  12. => "Person"
  13. irb(main):010:0> p.object_id
  14. irb(main):011:0> p2 = Person.new
  15. => #
  16. irb(main):012:0> p2.class.object_id
  17. => -604423968

如代码所示 Person.object_id == p.class.object_id == p2.class.object_id 可以他们都是一个东西。
即 p.class == p2.class == Person 都为Person的Ruby metaclass。

文章标题:如何取得定义类Rubymetaclass
浏览地址:http://www.shufengxianlan.com/qtweb/news36/433036.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联