Class: Hash::Ordered
Overview
:title: OrderedHash
Hash with preserved order and some array-like extensions.
Usage
Just require this file and use OrderedHash instead of Hash.
require 'hash/ordered'
# You can do simply
hsh = Hash::Ordered.new
hsh['z'] = 1
hsh['a'] = 2
hsh['c'] = 3
p hsh.keys #=> ['z','a','c']
# or using OrderedHash[] method
hsh = OrderedHash['z', 1, 'a', 2, 'c', 3]
p hsh.keys #=> ['z','a','c']
# but this don't preserve order
hsh = OrderedHash['z'=>1, 'a'=>2, 'c'=>3]
p hsh.keys #=> ['a','c','z']
# OrderedHash has useful extensions: push, pop and unshift
p hsh.push('to_end', 15) #=> true, key added
p hsh.push('to_end', 30) #=> false, already - nothing happen
p hsh.unshift('to_begin', 50) #=> true, key added
p hsh.unshift('to_begin', 60) #=> false, already - nothing happen
p hsh.keys #=> ["to_begin", "a", "c", "z", "to_end"]
p hsh.pop #=> ["to_end", 15], if nothing remains, return nil
p hsh.keys #=> ["to_begin", "a", "c", "z"]
p hsh.shift #=> ["to_begin", 30], if nothing remains, return nil
Author(s)
-
jan molic </mig/at/1984/dot/cz/>
Special Thanks
Andrew Johnson for his suggestions and fixes of Hash[], merge, to_a, inspect and shift.
Instance Attribute Summary collapse
-
#order ⇒ Object
Returns the value of attribute order.
Class Method Summary collapse
Instance Method Summary collapse
- #==(hsh2) ⇒ Object
- #clear ⇒ Object
- #delete(key) ⇒ Object
- #delete_if ⇒ Object
- #each ⇒ Object (also: #each_pair)
- #each_key ⇒ Object
- #each_value ⇒ Object
-
#initialize ⇒ Ordered
constructor
A new instance of Ordered.
- #inspect ⇒ Object
- #invert ⇒ Object
- #keys ⇒ Object
- #merge(hsh2) ⇒ Object
- #orig_store ⇒ Object
- #pop ⇒ Object
- #push(k, v) ⇒ Object
- #reject(&block) ⇒ Object
- #reject!(&block) ⇒ Object
- #replace(hsh2) ⇒ Object
- #select ⇒ Object
- #shift ⇒ Object
- #store(a, b) ⇒ Object (also: #[]=)
- #store_only(a, b) ⇒ Object
- #to_a ⇒ Object
- #to_s ⇒ Object
- #unshift(k, v) ⇒ Object
- #update(hsh2) ⇒ Object (also: #merge!)
- #values ⇒ Object
Methods included from DupReplaceSnapshotMixin
#restore_snapshot, #take_snapshot
Constructor Details
#initialize ⇒ Ordered
Returns a new instance of Ordered.
85 86 87 |
# File 'lib/mega/ohash.rb', line 85 def initialize @order = [] end |
Instance Attribute Details
#order ⇒ Object
Returns the value of attribute order.
69 70 71 |
# File 'lib/mega/ohash.rb', line 69 def order @order end |
Class Method Details
.[](*args) ⇒ Object
72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/mega/ohash.rb', line 72 def [] *args hsh = OrderedHash.new if Hash === args[0] hsh.replace args[0] elsif (args.size % 2) != 0 raise ArgumentError, "odd number of elements for Hash" else hsh[args.shift] = args.shift while args.size > 0 end hsh end |
Instance Method Details
#==(hsh2) ⇒ Object
100 101 102 103 |
# File 'lib/mega/ohash.rb', line 100 def == hsh2 return false if @order != hsh2.order super hsh2 end |
#clear ⇒ Object
105 106 107 108 |
# File 'lib/mega/ohash.rb', line 105 def clear @order = [] super end |
#delete(key) ⇒ Object
110 111 112 113 |
# File 'lib/mega/ohash.rb', line 110 def delete key @order.delete key super end |
#delete_if ⇒ Object
131 132 133 134 135 136 |
# File 'lib/mega/ohash.rb', line 131 def delete_if @order.clone.each { |k| delete k if yield } self end |
#each ⇒ Object Also known as: each_pair
125 126 127 128 |
# File 'lib/mega/ohash.rb', line 125 def each @order.each { |k| yield k,self[k] } self end |
#each_key ⇒ Object
115 116 117 118 |
# File 'lib/mega/ohash.rb', line 115 def each_key @order.each { |k| yield k } self end |
#each_value ⇒ Object
120 121 122 123 |
# File 'lib/mega/ohash.rb', line 120 def each_value @order.each { |k| yield self[k] } self end |
#inspect ⇒ Object
208 209 210 211 212 |
# File 'lib/mega/ohash.rb', line 208 def inspect ary = [] each {|k,v| ary << k.inspect + "=>" + v.inspect} '{' + ary.join(", ") + '}' end |
#invert ⇒ Object
148 149 150 151 152 |
# File 'lib/mega/ohash.rb', line 148 def invert hsh2 = Hash.new @order.each { |k| hsh2[self[k]] = k } hsh2 end |
#keys ⇒ Object
144 145 146 |
# File 'lib/mega/ohash.rb', line 144 def keys @order end |
#merge(hsh2) ⇒ Object
220 221 222 |
# File 'lib/mega/ohash.rb', line 220 def merge hsh2 self.dup update(hsh2) end |
#orig_store ⇒ Object
93 |
# File 'lib/mega/ohash.rb', line 93 alias orig_store store |
#pop ⇒ Object
193 194 195 196 |
# File 'lib/mega/ohash.rb', line 193 def pop key = @order.last key ? [key,delete(key)] : nil end |
#push(k, v) ⇒ Object
183 184 185 186 187 188 189 190 191 |
# File 'lib/mega/ohash.rb', line 183 def push k,v unless self.include? k @order.push k orig_store(k,v) true else false end end |
#reject(&block) ⇒ Object
154 155 156 |
# File 'lib/mega/ohash.rb', line 154 def reject &block self.dup.delete_if &block end |
#reject!(&block) ⇒ Object
158 159 160 161 |
# File 'lib/mega/ohash.rb', line 158 def reject! &block hsh2 = reject &block self == hsh2 ? nil : hsh2 end |
#replace(hsh2) ⇒ Object
163 164 165 166 |
# File 'lib/mega/ohash.rb', line 163 def replace hsh2 @order = hsh2.keys super hsh2 end |
#select ⇒ Object
224 225 226 227 228 |
# File 'lib/mega/ohash.rb', line 224 def select ary = [] each { |k,v| ary << [k,v] if yield k,v } ary end |
#shift ⇒ Object
168 169 170 171 |
# File 'lib/mega/ohash.rb', line 168 def shift key = @order.first key ? [key,delete(key)] : super end |
#store(a, b) ⇒ Object Also known as: []=
94 95 96 97 |
# File 'lib/mega/ohash.rb', line 94 def store a,b @order.push a unless has_key? a super a,b end |
#store_only(a, b) ⇒ Object
89 90 91 |
# File 'lib/mega/ohash.rb', line 89 def store_only a,b store a,b end |
#to_a ⇒ Object
198 199 200 201 202 |
# File 'lib/mega/ohash.rb', line 198 def to_a ary = [] each { |k,v| ary << [k,v] } ary end |
#to_s ⇒ Object
204 205 206 |
# File 'lib/mega/ohash.rb', line 204 def to_s self.to_a.to_s end |
#unshift(k, v) ⇒ Object
173 174 175 176 177 178 179 180 181 |
# File 'lib/mega/ohash.rb', line 173 def unshift k,v unless self.include? k @order.unshift k orig_store(k,v) true else false end end |
#update(hsh2) ⇒ Object Also known as: merge!
214 215 216 217 |
# File 'lib/mega/ohash.rb', line 214 def update hsh2 hsh2.each { |k,v| self[k] = v } self end |
#values ⇒ Object
138 139 140 141 142 |
# File 'lib/mega/ohash.rb', line 138 def values ary = [] @order.each { |k| ary.push self[k] } ary end |