在Ruby开发中,数组是最常用的数据结构之一,用来存储有序的元素集合,支持存储不同类型的数据。掌握多种数组创建方式,能够让我们在不同场景下更高效地编写代码。

字面量方式创建数组
这是最常用也最简洁的数组创建方式,直接使用方括号包裹元素,元素之间用逗号分隔即可。这种方式适合已知数组元素的情况,语法清晰直观。
# 创建包含整数的数组 int_arr = [1, 2, 3, 4, 5] # 创建包含不同数据类型的数组 mixed_arr = [1, "hello", :symbol, 3.14, true] # 创建空数组 empty_arr = [] puts int_arr.inspect puts mixed_arr.inspect puts empty_arr.inspect
使用Array.new方法创建数组
Array类的new方法提供了更灵活的数组创建能力,可以指定数组的长度、初始值,甚至通过块来生成每个元素的初始值。
指定长度的空数组
只传入长度参数时,数组会初始化为对应长度的nil元素集合。
# 创建长度为5的空数组,元素默认是nil arr1 = Array.new(5) puts arr1.inspect # 输出 [nil, nil, nil, nil, nil]
指定长度和初始值
传入第二个参数作为所有元素的初始值,需要注意如果是引用类型,所有元素会指向同一个对象。
# 创建长度为3,所有元素都是0的数组
arr2 = Array.new(3, 0)
puts arr2.inspect # 输出 [0, 0, 0]
# 注意:如果是哈希作为初始值,所有元素指向同一个哈希
arr3 = Array.new(2, {})
arr3[0][:a] = 1
puts arr3.inspect # 输出 [{:a=>1}, {:a=>1}],两个元素共享同一个哈希通过块生成初始值
传入块的话,每个元素都会调用块逻辑生成,避免引用类型共享的问题。
# 创建长度为3,每个元素是对应索引的平方的数组
arr4 = Array.new(3) { |i| i ** 2 }
puts arr4.inspect # 输出 [0, 1, 4]
# 创建包含两个不同哈希的数组
arr5 = Array.new(2) { {} }
arr5[0][:a] = 1
puts arr5.inspect # 输出 [{:a=>1}, {}],两个哈希互不影响使用%w和%W快捷方式创建字符串数组
当需要创建由字符串组成的数组时,%w和%W可以简化写法,不需要给每个字符串加引号,元素之间用空格分隔即可。%w不会进行字符串插值,%W支持字符串插值。
# %w创建字符串数组,元素不会被插值
arr6 = %w[apple banana orange]
puts arr6.inspect # 输出 ["apple", "banana", "orange"]
name = "ruby"
# %W支持插值
arr7 = %W[hello #{name} world]
puts arr7.inspect # 输出 ["hello", "ruby", "world"]使用数组推导式(map/filter组合)
可以通过对现有集合进行遍历处理,生成新的数组,这种方式适合基于已有数据生成新数组的场景。
# 基于范围生成1到5的平方数组
arr8 = (1..5).map { |i| i * 2 }
puts arr8.inspect # 输出 [2, 4, 6, 8, 10]
# 过滤现有数组生成新数组
original = [1, 2, 3, 4, 5, 6]
even_arr = original.select { |i| i.even? }
puts even_arr.inspect # 输出 [2, 4, 6]其他方法创建数组
还有一些场景下的特殊创建方式,比如通过字符串的split方法拆分得到数组,或者使用to_a方法将可枚举对象转为数组。
# 字符串拆分得到数组
str = "a,b,c,d"
arr9 = str.split(",")
puts arr9.inspect # 输出 ["a", "b", "c", "d"]
# 范围转数组
range = 1..3
arr10 = range.to_a
puts arr10.inspect # 输出 [1, 2, 3]不同创建方式的适用场景总结
| 创建方式 | 适用场景 |
|---|---|
| 字面量[] | 已知所有元素,元素数量少,类型不限 |
| Array.new | 需要指定长度、初始值,或者需要动态生成每个元素 |
| %w/%W | 创建纯字符串数组,简化引号书写 |
| 推导式/map/select | 基于已有集合处理生成新数组 |
| split/to_a | 从字符串、范围等可枚举对象转成数组 |