因为这个问题论述开来就仁者见仁智者见智了,所以我们做以下约定,仅从双方的字面意思来看,你支持左边还是右边?
规则: 请言明是支持左边还是右边,且在这个赌结束之前不得展开论述,以免干扰其他人判断
截止时间点:2015 年 11 月 1 日中午 12 点(即在这个时间点之前回的帖子,明确表明了自己的态度支持左边还是右边的)
最终结果以双方支持的数量多寡为标准
双方的论断如下:
Ruby 的对象是一堆的实例变量,加上指向类的引用。假如你自己在 Ruby 中定义了一个类,那么这个类的对象在 C 中是通过 Robject Structure 来实现。
As you can see, each klass value points to the Mathematician RClass struc- ture, and each RObject structure has a separate array of instance variables. Both arrays contain VALUE pointers—the same pointer that Ruby uses to refer to the RObject structure. (Notice that one of the objects contains two instance variables, while the other contains only one.)
为了性能,一些简单的 value,比如 1, 2, 3, 4, 5
,虽然是对象,但 Ruby 不使用任何 structure 来实现。
As a performance optimization, Ruby saves small integers, symbols, and a few other simple values with- out any structure at all, placing them right inside the VALUE pointer, as shown in Figure 5-5.
推荐两位阅读《Ruby under a microscope》
struct RClass {
struct RBasic basic;
struct st_table *iv_index_tbl;
};
实例变量的名字在类里面,st_table 是个 hash。 在我看来,没有本质这种说法,只是实现的细节不同,可以用数组实现,也可以用 hash 实现。
RClass 的代码我也读过一部分,还没完全读完读懂。我想把我的问题表达的更具体一些,便于讨论。
class B
end
b1 = B.new
b1.instance_eval{
@a = 1
@b = 2
}
b2 = B.new
b2.instance_eval{
@c = 1
@d = 2
}
同一个类不同对象的实例变量千差万别,key 也皆不同。
#8 楼 @xiaoronglv key 存在 b1 和 b2 的同一个 RClass 中。object 的 c 代码如下:
struct RObject {
struct RBasic basic;
union {
struct {
long numiv; #实例变量数量
VALUE *ivptr; #存放实例变量的数组
struct st_table *iv_index_tbl; #指向类的iv_index_tbl,是一个hash,key/value分别为变量名/变量位于变量数组的index
} heap;
} as;
};
object 每次新增变量的时候,都会在 iv_index_tbl 这个 hash 中添加一个 key/value,对应变量名/index,然后 ivptr[index] 设为变量值。查找变量的时候是根据变量名找到对应的 index,从 ivptr 中取出。 代码在 variable.c 中。