2013-02-08 13 views
5

2つの配列の共通部分を作成する場合、結果の順序が最初の配列の順序に基づいているという保証はありますか?例えば交差が行われたときに配列が配列順に保存されますか?

私は

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

を持っている場合、a & b(私が期待するものである)の代わりに[1,2,3]の、[3,2,1]を返すだろうか?

私は、RDocまたはPickaxeのArrayのドキュメントでこれを直接処理するものは見つかりませんでした。

RubySpecの仕様はcreates an array with elements in order they are first encounteredですが、YARV Rubyはその仕様を尊重しなければならないと思いますか?

+1

Cコード(http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-26)をすばやく見て、私はそれが注文を保存しているようだ – pjam

答えて

3

保証されているようです。彼らはrevision 39415のRDoc記述をアップグレードしました。いつか反映されるべきです。

0

YARVはバージョン1.9以降の公式なRubyインタプリタですので、その仕様を尊重していると思います。また、RubySpecは言語の実行可能な仕様として作成され、開発者はこの仕様に合格するインタープリタを作成することができ、RubySpecでYARVがRubySpecで作成されたと考えています。

+1

RubySpecはRubyの開発と公式の提携関係がないため、MRI/YARV Rubyが常にそのように動作することを保証するものではありませんが、今のところもっとそうです。 –

+0

@AndrewMarshall確かに、私はそういったことは示唆していません。私は単にこのことを指摘したかったので、私が言ったように、私はYARVがIronRubyのようなこの仕様を使用していたと信じています。 –

+0

RubySpecには正式な提携はありませんが、2010年にはMRIテストスイートの一部でした。私がIronRubyチームの一員としてそれに取り組んでいた時、彼らも積極的に貢献していました。 –

0

ドキュメントには保証はありませんが、交差は左側のセットの順序に従います。

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 

出力:

... 
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そのアレイ示すルビーを使用してい

 
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 

を1.9.3- p374

+1

私はそれがポイントではないと思います。 OPは、注文が保存されていることを知っていると思います(少なくとも現行のMRI実装では)。それが機能として意図されているかどうかは尋ねられます。言い換えれば、メソッドを実装する新しいCアルゴリズムが順序を保持しない場合、将来の実装は順序を保持しないか、または順序を保持しますか。 – sawa

+1

@sawaこれについてのバグレポートを投稿してくれてありがとう! –

+1

@AndrewGrimmよろしくお願いします。あなたが気づくかどうかわからなかった。あなたはそれを望んでいました。 http://bugs.ruby-lang.org/issues/7803 – sawa

関連する問題