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::BlankLineo; ;[ 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[i0o;;[;0;0[ @7@:I"lib/csv.rb;TI"lib/mkmf.rb;TI"lib/pp.rb;T@=@@I" pack.c;T@8cRDoc::TopLevel