Ruby 论坛打赌,请众位大神来评判

sefier · 2015年10月31日 · 最后由 nowherekai 回复于 2015年10月31日 · 2841 次阅读

因为这个问题论述开来就仁者见仁智者见智了,所以我们做以下约定,仅从双方的字面意思来看,你支持左边还是右边?

规则: 请言明是支持左边还是右边,且在这个赌结束之前不得展开论述,以免干扰其他人判断

截止时间点:2015 年 11 月 1 日中午 12 点(即在这个时间点之前回的帖子,明确表明了自己的态度支持左边还是右边的)

最终结果以双方支持的数量多寡为标准

双方的论断如下:

1 楼 已删除

最终结果以双方支持的数量多寡为标准

这样不行啊,必须以事实来判断,不能以支持人数来判断啊。

为什么说得好像左边和右边对立一样。 明明两边都是正确的。 hash 本质上是一个对象,而对象要用 hashtable 来实现,有什么问题吗?

估计他用静态语言的想法理解 JS 被虐了吧,只要是脚本就跟 JS 一样 不必理会

左方:Ruby 的对象是用 hash 实现的(错了。曾经是哈希,现在是数组)

Ruby 的对象是一堆的实例变量,加上指向类的引用。假如你自己在 Ruby 中定义了一个类,那么这个类的对象在 C 中是通过 Robject Structure 来实现。

  1. 其实例变量的保存形式是数组,不是哈希。(Ruby 1.8.7 其对象的实例变量是个哈希)
  2. klass 指向其类

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.)

右方:Ruby 对象的本质就是对象(这种说法也不太贴切)

为了性能,一些简单的 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》

我有个疑问:如果对象的实例变量在 Robject 中是个数组,它的 key 在哪呢?

struct RClass {
    struct RBasic basic;
    struct st_table *iv_index_tbl;
};

实例变量的名字在类里面,st_table 是个 hash。 在我看来,没有本质这种说法,只是实现的细节不同,可以用数组实现,也可以用 hash 实现。

#7 楼 @nowherekai

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 也皆不同。

  • key 是存在同一个 RClass 中吗?
  • 或者,key 存在每个对象的 eigenclass 的 RClass 中?

@无聊的人

投票定真理?文革遗风的节奏。

另外左边肯定是读了 python 的代码.. 因为 python 确实是 hash

#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,是一个hashkeyvalue分别为变量名/变量位于变量数组的index
    } heap;
    } as;
};

object 每次新增变量的时候,都会在 iv_index_tbl 这个 hash 中添加一个 key/value,对应变量名/index,然后 ivptr[index] 设为变量值。查找变量的时候是根据变量名找到对应的 index,从 ivptr 中取出。 代码在 variable.c 中。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号