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

基础

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容