2011-07-05 5 views
7

私はリストで「」をこのような何かをやっている:ルビの各イテレータは毎回同じ要素に同じ順序を与えることが保証されていますか?

a.each_with_index |outer, i| 
    a.each_with_index |inner, j| 
    if(j > i) 
     # do some operation with outer and inner 
    end 
    end 
end 

反復子が同じ順序を使用する予定されていない場合、これは動作しません。私は順序が実際に何であるか気にしない、私はちょうど2つの.each_with_indexイテレータが同じ順序を使う​​必要がある。

私は見ていませんでした...それはそれは一定の順序があり、私はちょうどイテレータがその順序を使用しないことを妄想しているんだという配列の財産になること

+0

「リスト」と言うときは、「配列」を意味しますか、「セット」を意味するのでしょうか? –

+0

この場合、配列です。私はいくつかのセットも持っています。各自が注文を意味するかどうか疑問に思っていたと思いますが、注文されたコレクションだけが注文されると仮定するのがより理にかなっています... –

答えて

15

これは、操作中の特定のEnumerableオブジェクトによって異なります。

たとえば、配列は常に同じ順序で要素を返します。しかし、他の列挙可能なオブジェクトは、このように動作することは保証されません。これの良い例は、1.8,7基底ハッシュです。そのため、多くのフレームワーク(特にActiveSupport)がOrderedHashを実装しています。

興味深い面白いことに、Hashでも、eachコールの間でハッシュが変更されていない場合、同じ順序でオブジェクトが返されます。多くのオブジェクトがこのように動作しますが、この微妙な部分に頼ることはおそらく素晴らしい考えではありません。

一般的なeachは、常に同じ順序でオブジェクトを返すわけではありません。

P.S. Ruby 1.9のハッシュが実際に注文されるようになりました。http://www.igvita.com/2009/02/04/ruby-19-internals-ordered-hash

6

を引き受けますあなたの実際のコードでお答えしますが、Ruby API docsからの回答は

です。配列はすべてのオブジェクトの整数インデックス型コレクションです。

だから、あなたは妄想していますが、それは確かにあなたが開発しているときには良いことですか?

+0

合意しました。 http://www.ruby-doc.org/core/classes/Array.html –

+2

私は、イテレータが(何らかの理由で)注文を変更する可能性があると考えています... –

2

配列は定義された要素のリストです。だからあなたはそれに問題はないはずです。

1

特定のEnumerableに依存します。確かに、配列は常に明白な順序で繰り返されます。

eachメソッドを実装するには、誰かが同じような方法で同じコレクションをトラバースするのはかなり狂っているでしょうが、そのような「フィーチャ」の唯一の実際の制限は、Enumerable 。さて、それと実装者の健全さ。

予期しない方法で意図的にコレクションを横断する暗号APIを想像することができます。

+0

私は時々.each_randomを実装しました。 .. –

+0

Heh、awesome ... – DigitalRoss

+0

また、統計的なテストのために、列挙型をランダムにトラバースすると便利です... – hildensia

関連する問題