Indexable is a mixin that provides index based methods, working soley with four methods: #, #, # and #.
These methods work in harmony. Where # returns a position of a given element, # returns elements for given positions. # is like # but replaces the given position with new values. This mehtod is not part of ruby core, but it generally just an alias for #[]=, just as # is an alias of #[]. # of course simply returns the total length of the indexable object.
Returns an array of the first element upto, but not including, the last element.
[1,2,3].body #=> [1,2]
# File lib/core/facets/indexable.rb, line 71 71: def body 72: slice(0,size-1) 73: end
A shorting of “ends at”, returns the last index of the indexable object. Returns nil if there are no elements.
[1,2,3,4,5].ends #=> 4
This nearly equivalent to +size - 1+.
# File lib/core/facets/indexable.rb, line 192 192: def ends 193: return nil if size == 0 194: size - 1 195: end
Returns first n elements.
"Hello World".first(3) #=> "Hel"
# File lib/core/facets/indexable.rb, line 130 130: def first(n=1) 131: slice(0, n.to_i) 132: end
Remove and return the first element.
a = [1,2,3] a.first! #=> 1 a #=> [2,3]
# File lib/core/facets/indexable.rb, line 170 170: def first! 171: splice(0) 172: end
Change the first element.
a = ["a","y","z"] a.first = "x" p a #=> ["x","y","z"]
# File lib/core/facets/indexable.rb, line 150 150: def first=(x) 151: splice(0,x) 152: end
Like #, returning the last element in an array.
[1,2,3].foot #=> [3]
# File lib/core/facets/indexable.rb, line 58 58: def foot 59: slice(1,1) 60: end
Like # but returns the first element in a new array.
[1,2,3].head #=> [1]
# File lib/core/facets/indexable.rb, line 41 41: def head 42: slice(0,1) 43: end
Returns the index of the first element equal to the given object or satisfying the block condition.
[1,2,3,4].index{ |e| e == 3 } #=> 2 [1,2,3,4].index{ |e| e > 3 } #=> 3
# File lib/core/facets/indexable.rb, line 217 217: def index(obj=nil, &block) 218: if block_given? 219: size.times do |i| 220: return i if yield(slice(i)) 221: end 222: else 223: size.times do |i| 224: return i if obj == slice(i) 225: end 226: end 227: nil 228: end
Returns last n elements.
"Hello World".last(3) #=> "rld"
# File lib/core/facets/indexable.rb, line 138 138: def last(n=1) 139: n = n.to_i 140: return self if n > size 141: slice(-n, n) #slice(-n..-1) 142: end
Remove and return the last element.
a = [1,2,3] a.last! #=> 3 a #=> [1,2]
# File lib/core/facets/indexable.rb, line 180 180: def last! 181: splice(1) 182: end
Change the last element.
a = [1,2,5] a.last = 3 p a #=> [1,2,3]
# File lib/core/facets/indexable.rb, line 160 160: def last=(x) 161: splice(1,x) 162: end
Returns the middle element of an array, or the element offset from middle if the parameter is given. Even-sized arrays, not having an exact middle, return the middle-right element.
[1,2,3,4,5].mid #=> 3 [1,2,3,4,5,6].mid #=> 4 [1,2,3,4,5,6].mid(-1) #=> 3 [1,2,3,4,5,6].mid(-2) #=> 2 [1,2,3,4,5,6].mid(1) #=> 5
In other words, If there are an even number of elements the higher-indexed of the two center elements is indexed as orgin (0).
# File lib/core/facets/indexable.rb, line 89 89: def mid(offset=0) 90: slice((size / 2) + offset) 91: end
Returns the middle element(s) of an array. Even-sized arrays, not having an exact middle, returns a two-element array of the two middle elements.
[1,2,3,4,5].middle #=> 3 [1,2,3,4,5,6].middle #=> [3,4]
In contrast to # which utilizes an offset.
# File lib/core/facets/indexable.rb, line 102 102: def middle 103: if size % 2 == 0 104: slice( (size / 2) - 1, 2 ) 105: #[slice((size / 2) - 1, 1), slice(size / 2, 1)] 106: else 107: slice(size / 2) 108: end 109: end
Returns the positive ordinal index given a cardinal position, 1 to n or -n to -1.
[1,2,3,4,5].pos(1) #=> 0 [1,2,3,4,5].pos(-1) #=> 4
# File lib/core/facets/indexable.rb, line 203 203: def pos(i) 204: if i > 0 205: return i - 1 206: else 207: size + i 208: end 209: end
Returns the index range between two elements. If no elements are given, returns the range from first to last.
['a','b','c','d'].range #=> 0..3 ['a','b','c','d'].range('b','d') #=> 1..2
# File lib/core/facets/indexable.rb, line 242 242: def range(a=nil,z=nil) 243: if !a 244: 0..(size-1) 245: else 246: index(a)..index(z) 247: end 248: end
Returns an array from second element to last element.
[1,2,3].tail #=> [2,3]
# File lib/core/facets/indexable.rb, line 49 49: def tail 50: slice(1,length-1) 51: end
Fetch values from a start index thru an end index.
[1,2,3,4,5].thru(0,2) #=> [1,2,3] [1,2,3,4,5].thru(2,4) #=> [3,4,5]
# File lib/core/facets/indexable.rb, line 116 116: def thru(from, to) 117: a = [] 118: i = from 119: while i <= to 120: a << slice(i) 121: i += 1 122: end 123: a 124: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.