Ruby入门——数组
1. 数组的定义
数组是许多指向对象的引用按顺序排列的数据结构。
数组中保存的是”指向对象的引用“,而不是对象本身。
2. 数组的创建
例1
a = 1 b = "str" #数组不一定都是同一类型 c = [a, b, 3 , "abcdef" ] #=> [1, "str", 3, "abcdef"] #数组可以嵌套使用 d = [a, c, [ 1 , 2 , 3 ]] #=> [1,[1, "str", 3, "abcdef"], [1, 2, 3]] |
3. 数组的索引
数组的各个元素按顺序被赋予了从0开始的编号,可使用这些编号和索引运算符[]对访问对象进行操作。
例2
p c[ 0 ] p c[ 1 ] p c[ 2 ] p c[ 3 ] #如果访问的索引值指向的元素不存在,则返回nil<br>p c[4] p d[ 2 ] #输出结果 #1 #"str" #3 #"abcdef" #nil #[1, 2, 3] |
负索引
负索引的存在,在Ruby中非常具有代表性。
Ruby中的数组对象的索引值是负数,是从末尾开始反向的编号所表示的元素。
数组的最后一个元素的编号是-1,在它前面的一个元素编号则是-2。
例3
p c[- 1 ] p c[- 2 ] #比最前面的元素还要前面,在数组范围之外 p c[- 5 ] #输出结果 #abcdef #3 #nil |
带有长度的索引
例4
p c[ 1 , 2 ] p c[ 1 , 3 ] p c[ 1 , 4 ] #利用负索引进行访问倒数两个索引值指向的元素<br>p c[-2,2] #对范围外进行访问<br>p c[4,2] #输出结果 #["str", 3] #["str", 3, "abcdef"] #["str", 3, "abcdef"] #[3, "abcdef"] #[] |
表示范围的索引
..表示包含末端的范围
...表示不包含末端的范围
例5
#包含末端的范围 p c[ 0 .. 1 ] #不包含末端的范围 p c[ 0 ... 1 ] p c[- 2 ..- 1 ] #负索引组合,-2表示倒数编号,3表示正数编号 p c[- 2 .. 3 ] p c[- 2 ... 3 ] p c[ 4 .. 5 ] #输出结果 [ 1 , "str" ] [ 1 ] [ 3 , "abcdef" ] [ 3 , "abcdef" ] [ 3 ] [] |
索引赋值
使用索引值可以对数组的内容进行替换。
例6
a = [ 1 , 2 ] p a a[ 0 ] = 3 p a #能够对超过数组长度的位置进行赋值,此时数组会被自动延长,空白索引部分用nil填充 a[ 4 ] = "4" p a a[ 0 , 3 ] = 'a' , 'b' , 'c' p a #当指定的元素个数比原数组的元素个数多时,数组会被加长并代入 a[ 0 , 3 ] = 'a' , 'b' , 'c' , 'd' p a a[ 1 .. 2 ] = 1 , 2 p a a[ 0 , 2 ] = "?" p a a[ 0 .. 2 ] = "A" p a a[- 1 ] = "Z" p a #输出结果 #[1, 2] #[3, 2] #[3, 2, nil, nil, "4"] #["a", "b", "c", nil, "4"] #["a", "b", "c", "d", nil, "4"] #["a", 1, 2, "d", nil, "4"] #["?", 2, "d", nil, "4"] #["A", nil, "4"] #["A", nil, "Z"] |
4. 数组的比较
例7
array1 = [ 1 , 2 , "str" ] array2 = [ 1 , 2 , "str" ] p array1 === array2 #=>true array = [ "str" , 1 , 2 ] p array === [ 1 , 2 , "str" , "extra" ] #=>false |
5. 数组的各种各样的方法
例8
array = [ "a" , "b" , "c" ] #输出数组的长度 p array.length #输出数组的元素个数(即长度) p array.size #array的元素copy p array *= 2 #是否包含c p array.include? "c" #对数组进行排序,生成新的数组,并不改变原来的array数组 p array.sort p array #消除重复元素,并不改变原来的array数组 p array.uniq p array #消除重复元素,并更新原来的array数组 array.uniq! p array #输出结果<br>#3 #3 #["a", "b", "c", "a", "b", "c"] #true #["a", "a", "b", "b", "c", "c"] #["a", "b", "c", "a", "b", "c"] #["a", "b", "c"] #["a", "b", "c", "a", "b", "c"] #["a", "b", "c"] |
6. 带有代码块的方法和迭代
对带有代码块的方法的调用进行编程时可以用do ... end 与 花括号{}。 do ... end 和花括号{}的区别仅仅在于结合强度而已。
数组对象拥有很多带有代码块的方法,其中很多事对反复操作的抽象化,成为迭代方法。其中最具代表性的是each。
例9
array = [ "a" , "b" , "c" ] <strong>array. each do |item|</strong> print item + "" end #输出结果 #abc |
7. 带有序数的反复操作
each_with_index是each的一种变体,能够同时获取数组元素和其索引值
例10
array = [ "a" , "b" , "c" ] array.each_with_index do |item, index| p [item, index] end #输出结果 #["a", 0] #["b", 1] #["c", 2] |
映射(Map)
例11-1
acids = [ "Adenin" , "Thymine" , "Guanine" , "Cytosine" ] sign = acids.map{|acid| acid[ 0 , 1 ]} p sign #输出结果 [ "A" , "T" , "G" , "C" ] |
例11-2
acids = [ "Adenin" , "Thymine" , "Guanine" , "Cytosine" ] #对acids内的元素分别进行小写转为大写,a为临时变量 sign = acids.map{|a| a.upcase} p sign #输出结果 #["ADENIN", "THYMINE", "GUANINE", "CYTOSINE"] |
8. 排序
例12
array = [ "73" , "2" , "5" , "1999" , "53" ] #按照默认的字符串排序 p array.sort #转化为数值后排序 p array.sort{|x,y| x.to_i <=> y.to_i} #输出结果 #["1999", "2", "5", "53", "73"] #["2", "5", "53", "73", "1999"] |
9. 选择
将代码块中的返回值为真的元素取出,组成新的数组并返回
例:students.select{|person| person.grade == 3}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
· 博客园2025新款「AI繁忙」系列T恤上架
· Avalonia跨平台实战(二),Avalonia相比WPF的便利合集(一)
· C# LINQ 快速入门实战指南,建议收藏学习!
· Redis实现高并发场景下的计数器设计
· 上周热点回顾(4.7-4.13)