Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 相交时数组中的顺序是否保持不变?_Ruby_Arrays - Fatal编程技术网

Ruby 相交时数组中的顺序是否保持不变?

Ruby 相交时数组中的顺序是否保持不变?,ruby,arrays,Ruby,Arrays,当我做两个数组的交集时,是否可以保证结果的顺序是基于第一个数组的顺序 例如,如果我有 a = [1,2,3] b = [3,2,1] a&b是否可以返回[3,2,1],而不是[1,2,3](这是我所期望的) 我在RDoc或Pickaxe的数组文档中都找不到任何直接解决这个问题的方法 RubySpec有一个规范,但我是否应该假设YARV Ruby将遵守该规范?自1.9版以来,YARV是Ruby的官方解释器,因此我假设它遵守该规范。顺便说一句,RubySpec是作为该语言的可执行规范创建的,允许开

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

例如,如果我有

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

我在RDoc或Pickaxe的数组文档中都找不到任何直接解决这个问题的方法


RubySpec有一个规范,但我是否应该假设YARV Ruby将遵守该规范?

自1.9版以来,YARV是Ruby的官方解释器,因此我假设它遵守该规范。顺便说一句,RubySpec是作为该语言的可执行规范创建的,允许开发人员创建自己的通过该规范的解释器,我相信YARV是在RubySpec中创建的。

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

源代码显示数组
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 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 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的,看起来这是一个有保证的特性。他们在中升级了RDoc描述。它应该会在某个时候反映出来。

通过快速查看C代码(),我会说它似乎保留了RubySpec与Ruby的开发没有正式联系的顺序,因此它不能保证MRI/YARV Ruby始终以这种方式工作,但更重要的是,它现在确实如此。@AndrewMarshall肯定,我不是在暗示什么。我只是想指出这一点,正如我所说的,我相信YARV正在使用这个规范,比如IronRuby。RubySpec没有正式的附属机构,但它在2010年是MRI测试套件的一部分,当我(作为IronRuby团队的一部分)在进行这项工作时,他们也在积极参与,我认为这不是重点。我认为OP知道顺序是保留的(至少在当前的MRI实现下)。问题是这是否是一个功能。换句话说,如果发现实现该方法的新C算法不保留顺序,那么将来的实现是不保留顺序,还是保留顺序。@AndrewGrim欢迎您。我不确定你是否会注意到。希望你会喜欢。 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