Начиная с Ruby 1.9, встроенный объект Hash
сохраняет порядок вставки. Например:
h = {}
h[:z] = 1
h[:b] = 2
h[:a] = 3
h[:x] = 0
p h.keys #=> [:z, :b, :a, :x]
h.delete :b
p h.keys #=> [:z, :a, :x]
h[:b] = 1
p h.keys #=> [:z, :a, :x, :b]
Таким образом, вы можете установить любое значение (например, простое true
) для любой клавиши, и теперь у вас есть упорядоченный набор. Вы можете проверить ключ, используя либо h.key?(obj)
, либо, если вы всегда устанавливаете для каждого ключа истинное значение, просто h[obj]
. Чтобы удалить ключ, используйте h.delete(obj)
. Чтобы преобразовать упорядоченный набор в массив, используйте h.keys
.
Поскольку библиотека Ruby 1.9 Set
в настоящее время построена на хэше, в настоящее время вы можете использовать Set
в качестве упорядоченного набора. (Например, реализация метода to_a
- это просто @hash.keys
.) Однако обратите внимание, что это поведение не гарантируется этой библиотекой, и может измениться в будущем.
require 'set'
s = Set[ :f, :o, :o, :b, :a, :r ] #=> #<Set: {:f, :o, :b, :a, :r}>
s << :z #=> #<Set: {:f, :o, :b, :a, :r, :z}>
s.delete :o #=> #<Set: {:f, :b, :a, :r, :z}>
s << :o #=> #<Set: {:f, :b, :a, :r, :z, :o}>
s << :o #=> #<Set: {:f, :b, :a, :r, :z, :o}>
s << :f #=> #<Set: {:f, :b, :a, :r, :z, :o}>
s.to_a #=> [:f, :b, :a, :r, :z, :o]