6

当我对两个数组进行交集时,是否可以保证生成的顺序基于第一个数组的顺序?

例如,如果我有

a = [1,2,3]
b = [3,2,1]

可以a & b返回[3,2,1],而不是[1,2,3](这是我所期望的)?

我在 RDoc 或 Pickaxe 的 Array 文档中都找不到直接解决此问题的任何内容。

RubySpec 有一个规范,它创建一个包含元素的数组,以便它们首先遇到,但我应该假设 YARV Ruby 会遵守该规范吗?

4

3 回答 3

4

看起来这是一个有保证的功能。他们升级了修订版 39415中的 RDoc 描述。它应该在某个时候反映出来。

于 2013-02-23T22:44:40.767 回答
0

YARV 从 1.9 版开始就是官方的 Ruby 解释器,所以我认为它确实尊重该规范。顺便说一句,RubySpec 是作为该语言的可执行规范创建的,允许开发人员创建自己的解释器来通过该规范,我相信 YARV 是在 RubySpec 中考虑到这一点而创建的。

于 2013-02-08T01:41:05.383 回答
0

文档中没有保证,但交集遵循左侧集合的顺序。

源代码显示数组a设置顺序:

...
for (i=0; i<RARRAY_LEN(ary1); i++) {
    vv = (st_data_t)(v = rb_ary_elt(ary1, i));
    if (st_delete(RHASH_TBL(hash), &vv, 0)) {
        rb_ary_push(ary3, v);
    }
}
...

测试很简单:

a = [1,2,3]
b = [3,2,1]

a.size.times do
    puts "a = #{ a.join(',') }\ta & b = #{ (a & b).join(',') }\tb & a = #{ (b & a).join(',') }"
  a.rotate! 
end

哪个输出:

a = 1,2,3 a & b = 1,2,3 b & a = 3,2,1
a = 2,3,1 a & b = 2,3,1 b & a = 3,2,1
a = 3,1,2 a & b = 3,1,2 b & a = 3,2,1

那是使用 Ruby 1.9.3-p374

于 2013-02-08T04:39:07.713 回答