Гарантирован ли итератор .each в ruby ​​каждый раз одинаковый порядок для одних и тех же элементов? - PullRequest
7 голосов
/ 06 июля 2011

Я делаю что-то вроде этого со списком 'a':

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

, если итератор не собирается использовать тот же порядок, это не будет работать.Мне все равно, какой порядок на самом деле, мне просто нужно, чтобы два итератора .each_with_index использовали один и тот же порядок.

Я бы предположил, что это будет свойство массива, у которого есть фиксированный порядок, иЯ просто параноик, что итератор не будет использовать этот порядок ...

Ответы [ 4 ]

15 голосов
/ 06 июля 2011

Это зависит от конкретного 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

7 голосов
/ 06 июля 2011

Я не посмотрел ваш реальный код, но вот ваш ответ, взятый из Ruby API документации :

Массивы - это упорядоченные, целочисленные коллекции любого объекта.

Так что да, вы параноик, но, конечно, это хорошо, когда вы развиваетесь?

2 голосов
/ 06 июля 2011

Массив по определению - это упорядоченный список элементов.Так что с этим проблем быть не должно.

1 голос
/ 06 июля 2011

Зависит от конкретного перечисляемого. Конечно, массив всегда будет повторяться в очевидном порядке.

Было бы довольно глупо для кого-то реализовать метод each, который бы проходил по одному и тому же набору разными способами, но единственное действительное ограничение для такой "функции" было бы в документации для класса, который смешивается в перечислимых. Ну, в этом и здравомыслие разработчиков.

Я почти представляю какой-то криптографический API, который преднамеренно обходил коллекцию непредсказуемым образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...