The ArrayFields module implements methods which allow an Array to be indexed by String or Symbol. It is not required to manually use this module to extend Arrays - they are auto-extended on a per-object basis when Array#fields= is called
# File lib/arrayfields.rb, line 286 286: def self.[] *pairs 287: new(*pairs) 288: end
# File lib/arrayfields.rb, line 276 276: def self.new *pairs 277: pairs = pairs.map{|pair| Enumerable === pair ? pair.to_a : pair}.flatten 278: raise ArgumentError, "pairs must be evenly sized" unless(pairs.size % 2 == 0) 279: (( array = [] )).fields = [] 280: 0.step(pairs.size - 2, 2) do |a| 281: b = a + 1 282: array[ pairs[a] ] = pairs[b] 283: end 284: array 285: end
methods redefined to work with fields as well as numeric indexes
# File lib/arrayfields.rb, line 54 54: def [] idx, *args 55: if @fieldset and (String === idx or Symbol === idx) 56: pos = @fieldset.pos idx 57: return nil unless pos 58: super(pos, *args) 59: else 60: super 61: end 62: end
# File lib/arrayfields.rb, line 73 73: def []=(idx, *args) 74: if @fieldset and (String === idx or Symbol === idx) 75: pos = @fieldset.pos idx 76: unless pos 77: @fieldset.fields << idx 78: @fieldset.fieldpos[idx] = pos = size 79: end 80: super(pos, *args) 81: else 82: super 83: end 84: end
# File lib/arrayfields.rb, line 85 85: def at idx 86: if @fieldset and (String === idx or Symbol === idx) 87: pos = @fieldset.pos idx 88: return nil unless pos 89: super pos 90: else 91: super 92: end 93: end
# File lib/arrayfields.rb, line 255 255: def clone 256: clone = super 257: ensure 258: clone.fields = fields.clone 259: end
# File lib/arrayfields.rb, line 267 267: def deepcopy 268: cp = Marshal.load(Marshal.dump(self)) 269: cp.fields = Marshal.load(Marshal.dump(self.fields)) 270: cp 271: end
# File lib/arrayfields.rb, line 94 94: def delete_at idx 95: if @fieldset and (String === idx or Symbol === idx) 96: pos = @fieldset.pos idx 97: return nil unless pos 98: new_fields = fields.dup 99: new_fields.delete_at(pos) 100: self.fields = new_fields 101: super pos 102: else 103: super 104: end 105: end
# File lib/arrayfields.rb, line 261 261: def dup 262: dup = super 263: ensure 264: dup.fields = fields.dup 265: end
# File lib/arrayfields.rb, line 157 157: def each_key 158: @fieldset.each{|field| yield field} 159: end
methods which give a hash-like interface
# File lib/arrayfields.rb, line 152 152: def each_pair 153: each_with_index do |elem, i| 154: yield @fieldset.fields[i], elem 155: end 156: end
# File lib/arrayfields.rb, line 160 160: def each_value *args, &block 161: each(*args, &block) 162: end
# File lib/arrayfields.rb, line 144 144: def each_with_field 145: each_with_index do |elem, i| 146: yield elem, @fieldset.fields[i] 147: end 148: end
# File lib/arrayfields.rb, line 163 163: def fetch key 164: self[key] or raise IndexError, 'key not found' 165: end
# File lib/arrayfields.rb, line 106 106: def fill(obj, *args) 107: idx = args.first 108: if idx and @fieldset and (String === idx or Symbol === idx) 109: idx = args.shift 110: pos = @fieldset.pos idx 111: super(obj, pos, *args) 112: else 113: super 114: end 115: end
# File lib/arrayfields.rb, line 167 167: def has_key? key 168: @fieldset.fields.include? key 169: end
# File lib/arrayfields.rb, line 177 177: def has_value? value 178: if respond_to? 'include?' 179: self.include? value 180: else 181: a = [] 182: each{|val| a << val} 183: a.include? value 184: end 185: end
# File lib/arrayfields.rb, line 131 131: def indexes(*idxs) 132: idxs.flatten! 133: if @fieldset 134: idxs.map!{|i| (String === i or Symbol === i) ? @fieldset.pos(i) : i} 135: end 136: super(*idxs) 137: end
# File lib/arrayfields.rb, line 124 124: def indices(*idxs) 125: idxs.flatten! 126: if @fieldset 127: idxs.map!{|i| (String === i or Symbol === i) ? @fieldset.pos(i) : i} 128: end 129: super(*idxs) 130: end
# File lib/arrayfields.rb, line 246 246: def invert 247: to_hash.invert 248: end
# File lib/arrayfields.rb, line 173 173: def key? key 174: @fieldset.fields.include? key 175: end
# File lib/arrayfields.rb, line 196 196: def keys 197: fields 198: end
# File lib/arrayfields.rb, line 170 170: def member? key 171: @fieldset.fields.include? key 172: end
# File lib/arrayfields.rb, line 243 243: def replace other 244: Hash === other ? update(other) : super 245: end
# File lib/arrayfields.rb, line 63 63: def slice idx, *args 64: if @fieldset and (String === idx or Symbol === idx) 65: pos = @fieldset.pos idx 66: return nil unless pos 67: super(pos, *args) 68: else 69: super 70: end 71: end
# File lib/arrayfields.rb, line 139 139: def slice!(*args) 140: ret = self[*args] 141: self[*args] = nil 142: ret 143: end
# File lib/arrayfields.rb, line 199 199: def store key, value 200: self[key] = value 201: end
# File lib/arrayfields.rb, line 225 225: def to_h 226: if respond_to? 'to_ary' 227: h = {} 228: @fieldset.fields.zip(to_ary){|f,e| h[f] = e} 229: h 230: else 231: a = [] 232: each{|val| a << val} 233: h = {} 234: @fieldset.fields.zip(a){|f,e| h[f] = e} 235: h 236: end 237: end
# File lib/arrayfields.rb, line 212 212: def to_hash 213: if respond_to? 'to_ary' 214: h = {} 215: @fieldset.fields.zip(to_ary){|f,e| h[f] = e} 216: h 217: else 218: a = [] 219: each{|val| a << val} 220: h = {} 221: @fieldset.fields.zip(a){|f,e| h[f] = e} 222: h 223: end 224: end
# File lib/arrayfields.rb, line 250 250: def to_pairs 251: fields.zip values 252: end
# File lib/arrayfields.rb, line 239 239: def update other 240: other.each{|k,v| self[k] = v} 241: to_hash 242: end
# File lib/arrayfields.rb, line 186 186: def value? value 187: if respond_to? 'include?' 188: self.include? value 189: else 190: a = [] 191: each{|val| a << val} 192: a.include? value 193: end 194: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.