Array

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

注意点

  1. 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
    
  2. 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
    
  • firstlast
    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]
    
  • attakedrop
    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"
    

注意点

  1. 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

注意点

  • count可以跟参数或者 block
    ary = [1, 2, 4, 2]
    ary.count                  #=> 4
    ary.count(2)               #=> 2
    ary.count { |x| x%2 == 0 } #=> 3
    

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]

注意点

  1. pushunshiftinsert 一次可以加入多个元素
    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]
    

注意点

  1. delete会将array中所有等于该数值的项都删掉
  2. 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
    
  3. uniq!可以跟 block
    c = [["student","sam"], ["student","george"], ["teacher","matz"]]
    c.uniq! { |s| s.first } # => [["student", "sam"], ["teacher", "matz"]]
    
  4. 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

基础

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容