当交叉完成时,顺序是否保留在数组中?

时间:2013-02-08 01:10:02

标签: ruby arrays

当我做两个数组的交集时,是否可以保证结果顺序基于第一个数组的顺序?

例如,如果我有

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

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

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

RubySpec的规范是creates an array with elements in order they are first encountered,但是我应该假设YARV Ruby会遵守该规范吗?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

YARV是1.9版以来的官方Ruby解释器,因此我认为它符合规范。 BTW,RubySpec被创建为该语言的可执行规范,允许开发人员创建自己的解释器,通过此规范,我相信YARV是在RubySpec中创建的。

答案 2 :(得分: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