Introduction
- 超类: Object
- 包含模块: Enumerable
New
基础
ary = [1, "two", 3.0] #=> [1, "two", 3.0]
ary = Array.new #=> []
Array.new(3) #=> [nil, nil, nil] 默认为 nil
Array.new(3, true) #=> [true, true, true]
提高
-
new
可以跟 block
Array.new(4) { Hash.new } #=> [{}, {}, {}, {}]
empty_table = Array.new(3) { Array.new(3) } #=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]
- Hash 转化为 Array
Array({:a => "a", :b => "b"}) #=> [[:a, "a"], [:b, "b"]]
{:a => "a", :b => "b"}.to_a #=> [[:a, "a"], [:b, "b"]]
注意点
-
new
的第二个参数,array 将填充同一个 object,==这里有陷阱==
a = Array.new(2, Hash.new)
# => [{}, {}]
a[0]['cat'] = 'feline'
a # => [{"cat"=>"feline"}, {"cat"=>"feline"}]
a[1]['cat'] = 'Felix'
a # => [{"cat"=>"Felix"}, {"cat"=>"Felix"}]
# 修改第一个 hash,第二个也跟着变,因为是同一个 object
-
new
中的 block, array 将填充不同的 object
a = Array.new(2) { Hash.new }
a[0]['cat'] = 'feline'
a # => [{"cat"=>"feline"}, {}]
Index
基础
-
slice
arr = [1, 2, 3, 4, 5, 6]
arr[2] #=> 3
arr[100] #=> nil
arr[-3] #=> 4
-
first
,last
arr.first #=> 1
arr.last #=> 6
提高
-
slice
arr[2, 3] #=> [3, 4, 5]
arr[1..4] #=> [2, 3, 4, 5]
arr[1..-3] #=> [2, 3, 4]
-
at
,take
,drop
arr.at(0) #=> 1
arr.take(3) #=> [1, 2, 3] 提取前3个元素
arr.drop(3) #=> [4, 5, 6] 排除前3个元素
-
fetch
,如果指定的 index 有元素就返回,否则返回指定的信息
a = [ 11, 22, 33, 44 ]
a.fetch(1) #=> 22
a.fetch(-1) #=> 44
a.fetch(4, 'cat') #=> "cat" 没有元素,返回指定的信息 cat
a.fetch(100) { |i| puts "#{i} is out of bounds" } #=> "100 is out of bounds"
注意点
-
slice
索引超出范围时需要特别注意,==这里有陷阱==
a = [ "a", "b", "c", "d", "e" ]
a[5] #=> nil
a[6, 1] #=> nil
a[5, 1] #=> []
a[5..10] #=> []
Information
基础
browsers = ['Chrome', 'Firefox', 'Safari', 'Opera', 'IE']
browsers.length #=> 5
browsers.count #=> 5
browsers.size #=> 5
提高
browsers.empty? #=> false
browsers.include?('Konqueror') #=> false
注意点
Add Items
基础
arr = [1, 2, 3, 4]
arr.push(5) #=> [1, 2, 3, 4, 5]
arr << 6 #=> [1, 2, 3, 4, 5, 6]
提高
arr.unshift(0) #=> [0, 1, 2, 3, 4, 5, 6]
arr.insert(3, 'apple') #=> [0, 1, 2, 'apple', 3, 4, 5, 6]
arr.insert(3, 'orange', 'pear', 'grapefruit') #=> [0, 1, 2, "orange", "pear", "grapefruit", "apple", 3, 4, 5, 6]
注意点
-
push
、unshift
和insert
一次可以加入多个元素
a = [ "b", "c", "d" ]
a.unshift("a") #=> ["a", "b", "c", "d"]
a.unshift(1, 2) #=> [ 1, 2, "a", "b", "c", "d"]
Remove Items
基础
-
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]
# 有多个2,全部被删掉了
-
compact
,删除 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 的值并没有变化
-
uniq
,合并重复项
arr = [2, 5, 6, 556, 6, 6, 8, 9, 0, 123, 556]
arr.uniq #=> [2, 5, 6, 556, 8, 9, 0, 123]
注意点
-
delete
会将array中所有等于该数值的项都删掉
-
compact!
和uniq!
可以改变原来 array 的值,==但是返回值有陷阱==
[ "a", nil, "b", nil, "c" ].compact! #=> [ "a", "b", "c" ]
[ "a", "b", "c" ].compact! #=> nil 没有 nil 项会返回 nil
a = [ "a", "a", "b", "b", "c" ]
a.uniq! # => ["a", "b", "c"]
b = [ "a", "b", "c" ]
b.uniq! # => nil 没有重复项会返回 nil
-
uniq!
可以跟 block
c = [["student","sam"], ["student","george"], ["teacher","matz"]]
c.uniq! { |s| s.first } # => [["student", "sam"], ["teacher", "matz"]]
-
slice!
也可以用来删除元素
a = [ "a", "b", "c" ]
a.slice!(1) #=> "b"
a #=> ["a", "c"]
a.slice!(-1) #=> "c"
a #=> ["a"]
a.slice!(100) #=> nil
a #=> ["a"]
Iterate Over 遍历
基础
-
each
arr = [1, 2, 3, 4, 5]
arr.each { |a| print a -= 10, " " }
# prints: -9 -8 -7 -6 -5
#=> [1, 2, 3, 4, 5] 原有 array 的值不变
-
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]
-
map!
arr.map! { |a| a**2 } #=> [1, 4, 9, 16, 25]
arr #=> [1, 4, 9, 16, 25]
Select Items
基础