本文简要介绍ruby语言中  Array类  的用法。
数组是有序的 integer-indexed 对象集合,称为 elements 。任何对象都可以是 Array 元素。
数组索引
数组索引从 0 开始,就像在 C 或 Java 中一样。
正索引是从第一个元素的偏移量:
- 
索引 0 表示第一个元素。 
- 
索引 1 表示第二个元素。 
- 
… 
负索引是从数组末尾向后的偏移量:
- 
索引 -1 表示最后一个元素。 
- 
索引 -2 表示next-to-last 元素。 
- 
… 
如果非负索引小于数组的大小,则为 in range。对于 3 元素数组:
- 
索引 0 到 2 在范围内。 
- 
索引 3 超出范围。 
如果其绝对值不大于数组的大小,则负索引为in range。对于 3 元素数组:
- 
索引 -1 到 -3 在范围内。 
- 
索引 -4 超出范围。 
创建数组
您可以使用以下命令显式创建 Array 对象:
- 
一个 array literal 。 
您可以使用以下方法将某些对象转换为数组:
- 
方法Array。 
一个数组可以包含不同类型的对象。例如,下面的数组包含一个  Integer  、一个  String  和一个浮点数:
ary = [1, "two", 3.0] #=> [1, "two", 3.0]也可以通过使用零、一( Array  的初始大小)或两个参数(初始大小和默认对象)调用  Array.new  来创建数组。
ary = Array.new    #=> []
Array.new(3)       #=> [nil, nil, nil]
Array.new(3, true) #=> [true, true, true]请注意,第二个参数使用对同一对象的引用填充数组。因此,仅在需要使用原生不可变对象(例如符号、数字、真或假)实例化数组的情况下才建议使用。
要创建具有单独对象的数组,可以传递一个块。此方法可以安全地用于可变对象,例如哈希、字符串或其他数组:
Array.new(4) {Hash.new}    #=> [{}, {}, {}, {}]
Array.new(4) {|i| i.to_s } #=> ["0", "1", "2", "3"]这也是构建多维数组的快速方法:
empty_table = Array.new(3) {Array.new(3)}
#=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]也可以使用由  Kernel  提供的 Array() 方法创建数组,该方法尝试调用  to_ary  ,然后对其参数调用  to_a 。
Array({:a => "a", :b => "b"}) #=> [[:a, "a"], [:b, "b"]]示例用法
除了通过 Enumerable  模块混合的方法之外, Array  类还具有用于访问、搜索和以其他方式操作数组的专有方法。
一些更常见的如下所示。
访问元素
可以使用 Array#[]  方法检索数组中的元素。它可以采用单个整数参数(数字索引)、一对参数(开始和长度)或范围。负索引从末尾开始计数,-1 是最后一个元素。
arr = [1, 2, 3, 4, 5, 6]
arr[2]    #=> 3
arr[100]  #=> nil
arr[-3]   #=> 4
arr[2, 3] #=> [3, 4, 5]
arr[1..4] #=> [2, 3, 4, 5]
arr[1..-3] #=> [2, 3, 4]访问特定数组元素的另一种方法是使用  at  方法
arr.at(0) #=> 1要为数组边界之外的索引引发错误,或者在发生这种情况时提供默认值,您可以使用  fetch  。
arr = ['a', 'b', 'c', 'd', 'e', 'f']
arr.fetch(100) #=> IndexError: index 100 outside of array bounds: -6...6
arr.fetch(100, "oops") #=> "oops"特殊方法 first  和 last  将分别返回数组的第一个和最后一个元素。
arr.first #=> 1
arr.last  #=> 6要返回数组的第一个 n 元素,请使用  take 
arr.take(3) #=> [1, 2, 3] drop  与  take  相反,通过在删除 n 元素之后返回元素:
arr.drop(3) #=> [4, 5, 6]获取有关  Array  的信息
数组始终跟踪自己的长度。要查询数组包含的元素数量,请使用  length  、  count  或  size  。
browsers = ['Chrome', 'Firefox', 'Safari', 'Opera', 'IE']
browsers.length #=> 5
browsers.count #=> 5检查数组是否包含任何元素
browsers.empty? #=> false检查特定项目是否包含在数组中
browsers.include?('Konqueror') #=> false向数组添加项
arr = [1, 2, 3, 4]
arr.push(5) #=> [1, 2, 3, 4, 5]
arr << 6    #=> [1, 2, 3, 4, 5, 6] unshift  将在数组的开头添加一个新项目。
arr.unshift(0) #=> [0, 1, 2, 3, 4, 5, 6]使用 insert ,您可以在数组的任何位置添加新元素。
arr.insert(3, 'apple')  #=> [0, 1, 2, 'apple', 3, 4, 5, 6]使用  insert  方法,您还可以一次插入多个值:
arr.insert(3, 'orange', 'pear', 'grapefruit')
#=> [0, 1, 2, "orange", "pear", "grapefruit", "apple", 3, 4, 5, 6]从  Array  中删除项目
方法  pop  删除数组中的最后一个元素并返回它:
arr =  [1, 2, 3, 4, 5, 6]
arr.pop #=> 6
arr #=> [1, 2, 3, 4, 5]要检索并同时删除第一项,请使用  shift  :
arr.shift #=> 1
arr #=> [2, 3, 4, 5]要删除特定索引处的元素:
arr.delete_at(2) #=> 4
arr #=> [2, 3, 5]要删除数组中任意位置的特定元素,请使用  delete  :
arr = [1, 2, 2, 3]
arr.delete(2) #=> 2
arr #=> [1,3]如果您需要从数组中删除 nil 值,一个有用的方法是  compact  :
arr = ['foo', 0, nil, 'bar', 7, 'baz', nil]
arr.compact  #=> ['foo', 0, 'bar', 7, 'baz']
arr          #=> ['foo', 0, nil, 'bar', 7, 'baz', nil]
arr.compact! #=> ['foo', 0, 'bar', 7, 'baz']
arr          #=> ['foo', 0, 'bar', 7, 'baz']另一个常见的需求是从数组中删除重复元素。
arr = [2, 5, 6, 556, 6, 6, 8, 9, 0, 123, 556]
arr.uniq #=> [2, 5, 6, 556, 8, 9, 0, 123]遍历数组
像所有包含 Enumerable  模块的类一样, Array  有一个 each 方法,它定义了应该迭代哪些元素以及如何迭代。在 Array 的  each  的情况下, Array  实例中的所有元素都按顺序生成给提供的块。
请注意,此操作使数组保持不变。
arr = [1, 2, 3, 4, 5]
arr.each {|a| print a -= 10, " "}
# prints: -9 -8 -7 -6 -5
#=> [1, 2, 3, 4, 5]另一个有时有用的迭代器是 reverse_each ,它将以相反的顺序迭代数组中的元素。
words = %w[first second third fourth fifth sixth]
str = ""
words.reverse_each {|word| str += "#{word} "}
p str #=> "sixth fifth fourth third second first " map  方法可用于基于原始数组创建一个新数组,但其值由提供的块修改:
arr.map {|a| 2*a}     #=> [2, 4, 6, 8, 10]
arr                   #=> [1, 2, 3, 4, 5]
arr.map! {|a| a**2}   #=> [1, 4, 9, 16, 25]
arr                   #=> [1, 4, 9, 16, 25]从  Array  中选择项目
可以根据块中定义的标准从数组中选择元素。选择可以以破坏性或非破坏性方式发生。虽然破坏性操作会修改调用它们的数组,但非破坏性方法通常会返回一个包含所选元素的新数组,但保持原始数组不变。
无损选择
arr = [1, 2, 3, 4, 5, 6]
arr.select {|a| a > 3}       #=> [4, 5, 6]
arr.reject {|a| a < 3}       #=> [3, 4, 5, 6]
arr.drop_while {|a| a < 4}   #=> [4, 5, 6]
arr                          #=> [1, 2, 3, 4, 5, 6]破坏性选择
 select! 和 reject! 是 select 和 reject 对应的破坏方法
与  select  与  reject  类似, delete_if  和  keep_if  在提供相同块时具有完全相反的结果:
arr.delete_if {|a| a < 4}   #=> [4, 5, 6]
arr                         #=> [4, 5, 6]
arr = [1, 2, 3, 4, 5, 6]
arr.keep_if {|a| a < 4}   #=> [1, 2, 3]
arr                       #=> [1, 2, 3]相关用法
- Ruby Array.push用法及代码示例
- Ruby Array.hash用法及代码示例
- Ruby Array permutation()用法及代码示例
- Ruby Array.to_a用法及代码示例
- Ruby Array.to_h用法及代码示例
- Ruby Array.to_s用法及代码示例
- Ruby Array class fill()用法及代码示例
- Ruby Array.array + other_array用法及代码示例
- Ruby Array product()用法及代码示例
- Ruby Array zip()用法及代码示例
- Ruby Array concat()用法及代码示例
- Ruby Array.take()用法及代码示例
- Ruby Array.reject!用法及代码示例
- Ruby Array.flatten!用法及代码示例
- Ruby Array.reject用法及代码示例
- Ruby Array compact!()用法及代码示例
- Ruby Array reject!()用法及代码示例
- Ruby Array.repeated_permutation()用法及代码示例
- Ruby Array.index()用法及代码示例
- Ruby Array.pack()用法及代码示例
- Ruby Array.rassoc(obj)用法及代码示例
- Ruby Array.values_at()用法及代码示例
- Ruby Array repeated_combination()用法及代码示例
- Ruby Array.each用法及代码示例
- Ruby Array.fetch用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Array类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
