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