引言:各种各样的面像对象语言总是说,世界万物皆为对象,都可以用类来描述,那么‘类‘是不是也属于万物之中呢?他是不是也可以用类来描述呢?
不得而知,我只用过C,C++,C#,ruyb,好像只有ruby是这样的。
1 对象存储数据,类存储方法。就是说,对象保存属于这个对象的数据,这样每个对象间的数据是独立的,各有各的存储空间,方法在内存中只有一份,就是由类保存。
2 什么是metaclass,简单来说就是,首先他是一个类,他是一个特殊的类,他描述的不是人,也不是飞机,是另外的一个类。
当Ruby 处理下面代码后,我们得到Person对象,它是Class类的实例
class Person
attr_accessor :age,:name
def initialize(age,name)
@name = name
@age = age
end
end
Class 也是一个对象,那么上面说对象中只存储数据,那么又如何解释呢?
只有查看Ruby的源代码,ruby是用C语言写的,里面的对象简单来说就是一些数据结构。
对于Class的对象,有一个m_tbl成员,从名字可见是一个方法表。可见Class对象要比一般的对象特别。
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 如何取得定义类的metaclass呢?最简单的两个方法,类名即是这个Class的metaclass.也可以能过类实例的.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 可以他们都是一个东西。
即 p.class == p2.class == Person 都为Person的metaclass
下回分析如何修改metaclass!
不得而知,我只用过C,C++,C#,ruyb,好像只有ruby是这样的。
1 对象存储数据,类存储方法。就是说,对象保存属于这个对象的数据,这样每个对象间的数据是独立的,各有各的存储空间,方法在内存中只有一份,就是由类保存。
2 什么是metaclass,简单来说就是,首先他是一个类,他是一个特殊的类,他描述的不是人,也不是飞机,是另外的一个类。
当Ruby 处理下面代码后,我们得到Person对象,它是Class类的实例
class Person
attr_accessor :age,:name
def initialize(age,name)
@name = name
@age = age
end
end
Class 也是一个对象,那么上面说对象中只存储数据,那么又如何解释呢?
只有查看Ruby的源代码,ruby是用C语言写的,里面的对象简单来说就是一些数据结构。
对于Class的对象,有一个m_tbl成员,从名字可见是一个方法表。可见Class对象要比一般的对象特别。
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 如何取得定义类的metaclass呢?最简单的两个方法,类名即是这个Class的metaclass.也可以能过类实例的.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 可以他们都是一个东西。
即 p.class == p2.class == Person 都为Person的metaclass
下回分析如何修改metaclass!