© Shine's Blog

Powered by LOFTER

[Ruby 文档] Array (1)

翻译:阳光

原文地址:https://www.ruby-doc.org/core-2.1.2/Array.html


Array


Array是以整数编号的任意object的有序集合。


Array的编号从0开始,跟C或Java一样。一个负数编号默认为与array的尾部相关,也就是说,编号-1指的是array的最后一个元素,-2是倒数第二个,以此类推。

-----------------------------

创建array

可以用文字构造函数[]来创建array。Array可以包含不同类型的object。例如,下面这个array包含了一个整数,一个字符串和一个浮点:


ary = [1, "two", 3.0] #=> [1, "two", 3.0]


也可以用.new来创建新的array,它可已包含0、1(array的起始大小)或2(array的起始大小和一个默认object)个argument。


ary = Array.new   #=> []

Array.new(3)      #=>[nil, nil, nil]

Array.new(3, true)#=>[true, true, true]


注意第二个argument会让每一个object都成为它。因此,只建议你用Symbol、数字、true、false。


可以创建一个包含有可更改内容的array,这个method可以使用不定性object,例如hash、string或其他array。


Array.new(4) { Hash.new } #=> [{}, {}, {}, {}]


这一是建立多维array的一个快捷方法:


empty_table = Array.new(3) { Array.new(3) }

# => [[nil,nil,nil], [nil, nil, nil], [nil, nil, nil]]


也可以用Array()来创建一个array,这个Kernel提供的方法会对它的argument先使用to_ary,然后使用to_a。


Array({:a => "a", :b => "b"}) #=> [[:a, "a"], [:b, "b"]]


-----------------------------

示例用法

Array作为一种可列举模块,可以对它进行访问、搜索和操作。

常用的如下所示。

-----------------------------

访问元素


一个array中的元素可以用#[]来取回。其argument可以是一个整数(编号)、一对数字(开始位置跟长度)或者是一个范围。负数从后开始数,-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


slice与#[]的用法一样。


译注:例如

arr.slice(1..-1) #=> [2, 3, 4, 5, 6]

译注完


要想让array在某个范围之外返回错误提示,或者是为这种情况提供一个默认返回值,可以用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这两个特殊的method会分别返回一个array的第一个和最后一个element。


arr.first #=> 1

arr.last  #=> 6


要想返回前n个元素,用take,


arr.take(3) #=> [1, 2, 3]


drop的作用与take相反,会返回n个之后的元素。


arr.drop(3) #=> [4, 5, 6]

-----------------------------

获得关于一个array的信息


array会一直关注自己的长度。用length、count或size来获得长度。


browsers = ['Chrome', 'Firefox', 'Safari', 'Opera', 'IE']

browsers.length #=> 5

browsers.count  #=> 5


查看一个array是否包含元素:


browsers.empty? #=> flase


查看array是否包含一个特定元素:


browsers.include?('Konqueror') #=> false

-----------------------------

向array添加内容


用push或<<可以向array尾部添加内容:


arr = [1, 2, 3, 4]

arr.push(5) #=> [1, 2, 3, 4, 5]

arr << 6    #=> [1, 2, 3, 4, 5, 6]


用unshift可以向array开头添加内容:


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, "organge", "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]


要删除一个array中所有的特定元素,用delete:


arr = [1, 2, 2, 3]

arr.delete(2) #=> 2

arr #=> [1,3]


移除一个array中所有的nil:


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']


移除一个array中重复的内容:

用uniq是非破坏性的,用uniq!是破坏性的:


arr =  [2, 5, 6, 556, 6, 6, 8, 9, 0, 123, 556]

arr.uniq #=> [2, 5, 6, 556, 8, 9, 0, 123]

-----------------------------

Array的迭代


作为一个可列举的模块,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 fitst"


用map可以根据原来的array创建一个新的array,所有的元素都要经过紧随其后的代码的调整:


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中选择内容

元素可以根据一定条件被选择。选择可以以一种破坏性或是非破坏性的方式实现。破坏性操作会改变array,非破坏性的则通常会返回一个由被选择元素构成的新元素,而不会改变原来的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]


发表于2014-07-15.