U:RDoc::NormalClass[iI"
Array:ET@I"Object;To:RDoc::Markup::Document:@parts[ o;;[}o:RDoc::Markup::Paragraph;[I"CArrays are ordered, integer-indexed collections of any object.;To:RDoc::Markup::BlankLine o; ;[ I"OArray indexing starts at 0, as in C or Java. A negative index is assumed ;TI"Pto be relative to the end of the array---that is, an index of -1 indicates ;TI"Jthe last element of the array, -2 is the next to last element in the ;TI"array, and so on.;T@S:RDoc::Markup::Heading:
leveli: textI"Creating Arrays;T@o; ;[I"AA new array can be created by using the literal constructor ;TI"K[]
. Arrays can contain different types of objects. For ;TI"Hexample, the array below contains an Integer, a String and a Float:;T@o:RDoc::Markup::Verbatim;[I"/ary = [1, "two", 3.0] #=> [1, "two", 3.0]
;T:@format0o; ;[I"QAn array can also be created by explicitly calling Array.new with zero, one ;TI"N(the initial size of the Array) or two arguments (the initial size and a ;TI"default object).;T@o;;[I"ary = Array.new #=> []
;TI",Array.new(3) #=> [nil, nil, nil]
;TI"/Array.new(3, true) #=> [true, true, true]
;T;0o; ;[ I"NNote that the second argument populates the array with references to the ;TI"Osame object. Therefore, it is only recommended in cases when you need to ;TI"Iinstantiate arrays with natively immutable objects such as Symbols, ;TI"numbers, true or false.;T@o; ;[I"MTo create an array with separate objects a block can be passed instead. ;TI"PThis method is safe to use with mutable objects such as hashes, strings or ;TI"other arrays:;T@o;;[I"5Array.new(4) { Hash.new } #=> [{}, {}, {}, {}]
;TI"9Array.new(4) {|i| i.to_s } #=> ["0", "1", "2", "3"]
;T;0o; ;[I"CThis is also a quick way to build up multi-dimensional arrays:;T@o;;[I"1empty_table = Array.new(3) { Array.new(3) }
;TI"=#=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]
;T;0o; ;[I"KAn array can also be created by using the Array() method, provided by ;TI"EKernel, which tries to call #to_ary, then #to_a on its argument.;T@o;;[I">Array({:a => "a", :b => "b"}) #=> [[:a, "a"], [:b, "b"]]
;T;0S;;i;
I"Example Usage;T@o; ;[I"OIn addition to the methods it mixes in through the Enumerable module, the ;TI"PArray class has proprietary methods for accessing, searching and otherwise ;TI"manipulating arrays.;T@o; ;[I"8Some of the more common ones are illustrated below.;T@S;;i;
I"Accessing Elements;T@o; ;[ I"NElements in an array can be retrieved using the Array#[] method. It can ;TI"Ktake a single integer argument (a numeric index), a pair of arguments ;TI"R(start and length) or a range. Negative indices start counting from the end, ;TI"$with -1 being the last element.;T@o;;[I"arr = [1, 2, 3, 4, 5, 6]
;TI"arr[2] #=> 3
;TI"arr[100] #=> nil
;TI"arr[-3] #=> 4
;TI"arr[2, 3] #=> [3, 4, 5]
;TI" arr[1..4] #=> [2, 3, 4, 5]
;TI"arr[1..-3] #=> [2, 3, 4]
;T;0o; ;[I"PAnother way to access a particular array element is by using the #at method;T@o;;[I"arr.at(0) #=> 1
;T;0o; ;[I"@The #slice method works in an identical manner to Array#[].;T@o; ;[I"JTo raise an error for indices outside of the array bounds or else to ;TI"Cprovide a default value when that happens, you can use #fetch.;T@o;;[I"*arr = ['a', 'b', 'c', 'd', 'e', 'f']
;TI"Narr.fetch(100) #=> IndexError: index 100 outside of array bounds: -6...6
;TI"'arr.fetch(100, "oops") #=> "oops"
;T;0o; ;[I"IThe special methods #first and #last will return the first and last ;TI"(elements of an array, respectively.;T@o;;[I"arr.first #=> 1
;TI"arr.last #=> 6
;T;0o; ;[I" [1, 2, 3]
;T;0o; ;[I"K#drop does the opposite of #take, by returning the elements after +n+ ;TI" elements have been dropped:;T@o;;[I"arr.drop(3) #=> [4, 5, 6]
;T;0S;;i;
I")Obtaining Information about an Array;T@o; ;[I"LArrays keep track of their own length at all times. To query an array ;TI"Labout the number of elements it contains, use #length, #count or #size.;T@o;;[I"?browsers = ['Chrome', 'Firefox', 'Safari', 'Opera', 'IE']
;TI"browsers.length #=> 5
;TI"browsers.count #=> 5
;T;0o; ;[I";To check whether an array contains any elements at all;T@o;;[I"browsers.empty? #=> false
;T;0o; ;[I"@To check whether a particular item is included in the array;T@o;;[I".browsers.include?('Konqueror') #=> false
;T;0S;;i;
I"Adding Items to Arrays;T@o; ;[I"KItems can be added to the end of an array by using either #push or #<<;T@o;;[I"arr = [1, 2, 3, 4]
;TI"%arr.push(5) #=> [1, 2, 3, 4, 5]
;TI"(arr << 6 #=> [1, 2, 3, 4, 5, 6]
;T;0o; ;[I"?#unshift will add a new item to the beginning of an array.;T@o;;[I".arr.unshift(0) #=> [0, 1, 2, 3, 4, 5, 6]
;T;0o; ;[I"HWith #insert you can add a new element to an array at any position.;T@o;;[I"@arr.insert(3, 'apple') #=> [0, 1, 2, 'apple', 3, 4, 5, 6]
;T;0o; ;[I"KUsing the #insert method, you can also insert multiple values at once:;T@o;;[I"3arr.insert(3, 'orange', 'pear', 'grapefruit')
;TI"H#=> [0, 1, 2, "orange", "pear", "grapefruit", "apple", 3, 4, 5, 6]
;T;0S;;i;
I"!Removing Items from an Array;T@o; ;[I"IThe method #pop removes the last element in an array and returns it:;T@o;;[I"arr = [1, 2, 3, 4, 5, 6]
;TI"arr.pop #=> 6
;TI"arr #=> [1, 2, 3, 4, 5]
;T;0o; ;[I"HTo retrieve and at the same time remove the first item, use #shift:;T@o;;[I"arr.shift #=> 1
;TI"arr #=> [2, 3, 4, 5]
;T;0o; ;[I"0To delete an element at a particular index:;T@o;;[I"arr.delete_at(2) #=> 4
;TI"arr #=> [2, 3, 5]
;T;0o; ;[I"FTo delete a particular element anywhere in an array, use #delete:;T@o;;[I"arr = [1, 2, 2, 3]
;TI"arr.delete(2) #=> 2
;TI"arr #=> [1,3]
;T;0o; ;[I"IA useful method if you need to remove +nil+ values from an array is ;TI"#compact:;T@o;;[
I"1arr = ['foo', 0, nil, 'bar', 7, 'baz', nil]
;TI"2arr.compact #=> ['foo', 0, 'bar', 7, 'baz']
;TI" ['foo', 0, nil, 'bar', 7, 'baz', nil]
;TI"2arr.compact! #=> ['foo', 0, 'bar', 7, 'baz']
;TI"2arr #=> ['foo', 0, 'bar', 7, 'baz']
;T;0o; ;[I"GAnother common need is to remove duplicate elements from an array.;T@o; ;[I"DIt has the non-destructive #uniq, and destructive method #uniq!;T@o;;[I"3arr = [2, 5, 6, 556, 6, 6, 8, 9, 0, 123, 556]
;TI"/arr.uniq #=> [2, 5, 6, 556, 8, 9, 0, 123]
;T;0S;;i;
I"Iterating over Arrays;T@o; ;[ I"LLike all classes that include the Enumerable module, Array has an each ;TI"Nmethod, which defines what elements should be iterated over and how. In ;TI"Ncase of Array's #each, all elements in the Array instance are yielded to ;TI"$the supplied block in sequence.;T@o; ;[I"9Note that this operation leaves the array unchanged.;T@o;;[ I"arr = [1, 2, 3, 4, 5]
;TI")arr.each { |a| print a -= 10, " " }
;TI"# prints: -9 -8 -7 -6 -5
;TI"#=> [1, 2, 3, 4, 5]
;T;0o; ;[I"PAnother sometimes useful iterator is #reverse_each which will iterate over ;TI"0the elements in the array in reverse order.;T@o;;[ I"7words = %w[first second third fourth fifth sixth]
;TI"str = ""
;TI"5words.reverse_each { |word| str += "#{word} " }
;TI"8p str #=> "sixth fifth fourth third second first "
;T;0o; ;[I"MThe #map method can be used to create a new array based on the original ;TI"?array, but with the values modified by the supplied block:;T@o;;[ I"0arr.map { |a| 2*a } #=> [2, 4, 6, 8, 10]
;TI"/arr #=> [1, 2, 3, 4, 5]
;TI"1arr.map! { |a| a**2 } #=> [1, 4, 9, 16, 25]
;TI"1arr #=> [1, 4, 9, 16, 25]
;T;0S;;i;
I""Selecting Items from an Array;T@o; ;[
I"OElements can be selected from an array according to criteria defined in a ;TI"Lblock. The selection can happen in a destructive or a non-destructive ;TI"Omanner. While the destructive operations will modify the array they were ;TI"Pcalled on, the non-destructive methods usually return a new array with the ;TI"?selected elements, but leave the original array unchanged.;T@S;;i;
I"Non-destructive Selection;T@o;;[
I"arr = [1, 2, 3, 4, 5, 6]
;TI"0arr.select { |a| a > 3 } #=> [4, 5, 6]
;TI"3arr.reject { |a| a < 3 } #=> [3, 4, 5, 6]
;TI"0arr.drop_while { |a| a < 4 } #=> [4, 5, 6]
;TI"9arr #=> [1, 2, 3, 4, 5, 6]
;T;0S;;i;
I"Destructive Selection;T@o; ;[I"P#select! and #reject! are the corresponding destructive methods to #select ;TI"and #reject;T@o; ;[I"LSimilar to #select vs. #reject, #delete_if and #keep_if have the exact ;TI"7opposite result when supplied with the same block:;T@o;;[I"/arr.delete_if { |a| a < 4 } #=> [4, 5, 6]
;TI"/arr #=> [4, 5, 6]
;TI"
;TI"arr = [1, 2, 3, 4, 5, 6]
;TI"-arr.keep_if { |a| a < 4 } #=> [1, 2, 3]
;TI",arr #=> [1, 2, 3];T;0:
@fileI"array.c;T:0@omit_headings_from_table_of_contents_below0o;;[ ;I"lib/abbrev.rb;T;0o;;[ ;I"lib/rexml/xpath_parser.rb;T;0o;;[ ;I"lib/shellwords.rb;T;0;0;0[ [ [[I"Enumerable;To;;[ ;@7;0I"array.c;T[[I"
class;T[[:public[[I"[];T@H[I"new;T@H[I"try_convert;T@H[:protected[ [:private[ [I"
instance;T[[;[i[I"&;T@H[I"*;T@H[I"+;T@H[I"-;T@H[I"<<;T@H[I"<=>;T@H[I"==;T@H[I"[];T@H[I"[]=;T@H[I"abbrev;FI"lib/abbrev.rb;T[I" any?;T@H[I"
assoc;T@H[I"at;T@H[I"bsearch;T@H[I"bsearch_index;T@H[I"
clear;T@H[I"collect;T@H[I"
collect!;T@H[I"combination;T@H[I"compact;T@H[I"
compact!;T@H[I"concat;T@H[I"
count;T@H[I"
cycle;T@H[I"dclone;FI"lib/rexml/xpath_parser.rb;T[I"delete;T@H[I"delete_at;T@H[I"delete_if;T@H[I"dig;T@H[I" drop;T@H[I"drop_while;T@H[I" each;T@H[I"each_index;T@H[I"empty?;T@H[I" eql?;T@H[I"
fetch;T@H[I" fill;T@H[I"find_index;T@H[I"
first;T@H[I"flatten;T@H[I"
flatten!;T@H[I"frozen?;T@H[I" hash;T@H[I"
include?;T@H[I"
index;T@H[I"initialize_copy;T@H[I"insert;T@H[I"inspect;T@H[I" join;T@H[I"keep_if;T@H[I" last;T@H[I"length;T@H[I"map;T@H[I" map!;T@H[I"max;T@H[I"min;T@H[I" pack;TI"pack.c;T[I"permutation;T@H[I"pop;T@H[I"product;T@H[I" push;T@H[I"rassoc;T@H[I"reject;T@H[I"reject!;T@H[I"repeated_combination;T@H[I"repeated_permutation;T@H[I"replace;T@H[I"reverse;T@H[I"
reverse!;T@H[I"reverse_each;T@H[I"rindex;T@H[I"rotate;T@H[I"rotate!;T@H[I"sample;T@H[I"select;T@H[I"select!;T@H[I"shelljoin;FI"lib/shellwords.rb;T[I"
shift;T@H[I"shuffle;T@H[I"
shuffle!;T@H[I" size;T@H[I"
slice;T@H[I"slice!;T@H[I" sort;T@H[I"
sort!;T@H[I"
sort_by!;T@H[I"sum;T@H[I" take;T@H[I"take_while;T@H[I" to_a;T@H[I"to_ary;T@H[I" to_h;T@H[I" to_s;T@H[I"transpose;T@H[I" uniq;T@H[I"
uniq!;T@H[I"unshift;T@H[I"values_at;T@H[I"zip;T@H[I"|;T@H[;[ [;[ [ [U:RDoc::Context::Section[i 0o;;[ ;0;0[
@7@:I"lib/csv.rb;TI"lib/mkmf.rb;TI"lib/pp.rb;T@=@@I"pack.c;T@8cRDoc::TopLevel