Class: OrderedHash
- Inherits:
-
Hash
- Object
- Hash
- OrderedHash
- Defined in:
- lib/orderedhash.rb
Overview
OrderedHash
Version
1.2006.07.13 (change of the first number means Big Change)
Description
Hash which preserves order of added items (like PHP array).
Usage
(see examples directory under the ruby gems root directory)
require 'rubygems'
require 'ordered_hash'
hsh = OrderedHash.new
hsh['z'] = 1
hsh['a'] = 2
hsh['c'] = 3
p hsh.keys # ['z','a','c']
Source
simplypowerful.1984.cz/goodlibs/1.2006.07.13
Author
jan molic (/mig/at_sign/1984/dot/cz/)
Thanks to
Andrew Johnson for his suggestions and fixes of Hash[], merge, to_a, inspect and shift
Desmond Dsouza for == fixes
Licence
You can redistribute it and/or modify it under the same terms of Ruby's license;
either the dual license version in 2003, or any later version.
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
- #first ⇒ Object
-
#initialize(*a, &b) ⇒ OrderedHash
constructor
A new instance of OrderedHash.
- #inspect ⇒ Object
- #invert ⇒ Object
- #keys ⇒ Object
- #last ⇒ 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
Constructor Details
#initialize(*a, &b) ⇒ OrderedHash
Returns a new instance of OrderedHash.
57 58 59 60 |
# File 'lib/orderedhash.rb', line 57 def initialize(*a, &b) super @order = [] end |
Instance Attribute Details
#order ⇒ Object
Returns the value of attribute order.
39 40 41 |
# File 'lib/orderedhash.rb', line 39 def order @order end |
Class Method Details
.[](*args) ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/orderedhash.rb', line 43 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
75 76 77 78 79 |
# File 'lib/orderedhash.rb', line 75 def == hsh2 return hsh2==self if !hsh2.is_a?(OrderedHash) return false if @order != hsh2.order super hsh2 end |
#clear ⇒ Object
81 82 83 84 |
# File 'lib/orderedhash.rb', line 81 def clear @order = [] super end |
#delete(key) ⇒ Object
86 87 88 89 |
# File 'lib/orderedhash.rb', line 86 def delete key @order.delete key super end |
#delete_if ⇒ Object
108 109 110 111 112 113 |
# File 'lib/orderedhash.rb', line 108 def delete_if @order.clone.each { |k| delete k if yield } self end |
#each ⇒ Object Also known as: each_pair
101 102 103 104 |
# File 'lib/orderedhash.rb', line 101 def each @order.each { |k| yield k,self[k] } self end |
#each_key ⇒ Object
91 92 93 94 |
# File 'lib/orderedhash.rb', line 91 def each_key @order.each { |k| yield k } self end |
#each_value ⇒ Object
96 97 98 99 |
# File 'lib/orderedhash.rb', line 96 def each_value @order.each { |k| yield self[k] } self end |
#first ⇒ Object
175 176 177 |
# File 'lib/orderedhash.rb', line 175 def first self[@order.first] end |
#inspect ⇒ Object
193 194 195 196 197 |
# File 'lib/orderedhash.rb', line 193 def inspect ary = [] each {|k,v| ary << k.inspect + "=>" + v.inspect} '{' + ary.join(", ") + '}' end |
#invert ⇒ Object
125 126 127 128 129 |
# File 'lib/orderedhash.rb', line 125 def invert hsh2 = Hash.new @order.each { |k| hsh2[self[k]] = k } hsh2 end |
#keys ⇒ Object
121 122 123 |
# File 'lib/orderedhash.rb', line 121 def keys @order end |
#last ⇒ Object
179 180 181 |
# File 'lib/orderedhash.rb', line 179 def last self[@order.last] end |
#merge(hsh2) ⇒ Object
206 207 208 |
# File 'lib/orderedhash.rb', line 206 def merge hsh2 self.dup update(hsh2) end |
#orig_store ⇒ Object
66 |
# File 'lib/orderedhash.rb', line 66 alias orig_store store |
#pop ⇒ Object
170 171 172 173 |
# File 'lib/orderedhash.rb', line 170 def pop key = @order.last key ? [key,delete(key)] : nil end |
#push(k, v) ⇒ Object
160 161 162 163 164 165 166 167 168 |
# File 'lib/orderedhash.rb', line 160 def push k,v unless self.include? k @order.push k orig_store(k,v) true else false end end |
#reject(&block) ⇒ Object
131 132 133 |
# File 'lib/orderedhash.rb', line 131 def reject &block self.dup.delete_if( &block ) end |
#reject!(&block) ⇒ Object
135 136 137 138 |
# File 'lib/orderedhash.rb', line 135 def reject! &block hsh2 = reject( &block ) self == hsh2 ? nil : hsh2 end |
#replace(hsh2) ⇒ Object
140 141 142 143 |
# File 'lib/orderedhash.rb', line 140 def replace hsh2 @order = hsh2.keys super hsh2 end |
#select ⇒ Object
210 211 212 213 214 |
# File 'lib/orderedhash.rb', line 210 def select ary = [] each { |k,v| ary << [k,v] if yield k,v } ary end |
#shift ⇒ Object
145 146 147 148 |
# File 'lib/orderedhash.rb', line 145 def shift key = @order.first key ? [key,delete(key)] : super end |
#store(a, b) ⇒ Object Also known as: []=
68 69 70 71 |
# File 'lib/orderedhash.rb', line 68 def store a,b @order.push a unless has_key? a super a,b end |
#store_only(a, b) ⇒ Object
62 63 64 |
# File 'lib/orderedhash.rb', line 62 def store_only a,b store a,b end |
#to_a ⇒ Object
183 184 185 186 187 |
# File 'lib/orderedhash.rb', line 183 def to_a ary = [] each { |k,v| ary << [k,v] } ary end |
#to_s ⇒ Object
189 190 191 |
# File 'lib/orderedhash.rb', line 189 def to_s self.to_a.to_s end |
#unshift(k, v) ⇒ Object
150 151 152 153 154 155 156 157 158 |
# File 'lib/orderedhash.rb', line 150 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!
199 200 201 202 |
# File 'lib/orderedhash.rb', line 199 def update hsh2 hsh2.each { |k,v| self[k] = v } self end |
#values ⇒ Object
115 116 117 118 119 |
# File 'lib/orderedhash.rb', line 115 def values ary = [] @order.each { |k| ary.push self[k] } ary end |