Ruby 数组(Array)
在 Ruby 中,数组(Array) 是一种有序的数据结构,用于存储多个元素(可以是任何类型:数字、字符串、对象等)。Ruby 的数组功能强大,提供了丰富的内置方法来操作和处理数据。以下是对 Ruby 数组的中文讲解,涵盖创建、操作、常见方法等关键内容,力求简洁清晰。
1. 创建数组
Ruby 提供多种方式创建数组:
- 字面量:使用方括号
[]
。
arr = [1, "Ruby", true]
puts arr # 输出:1, Ruby, true
- Array.new:通过构造方法创建。
arr = Array.new # 空数组
arr = Array.new(3) # [nil, nil, nil]
arr = Array.new(3, "default") # ["default", "default", "default"]
- %w 和 %i:快速创建字符串或符号数组。
arr = %w(apple banana cherry) # ["apple", "banana", "cherry"]
sym = %i(up down left) # [:up, :down, :left]
2. 访问和修改数组
- 索引访问:从 0 开始,支持负索引(从末尾计数)。
arr = ["a", "b", "c"]
puts arr[0] # 输出:a
puts arr[-1] # 输出:c
puts arr[1, 2] # 输出:["b", "c"](范围)
- 修改元素:
arr[1] = "new"
puts arr # 输出:["a", "new", "c"]
- 范围操作:
arr[1..2] = ["x", "y"]
puts arr # 输出:["a", "x", "y"]
3. 常见数组方法
Ruby 数组提供大量内置方法,简化操作:
添加/删除元素
push
或<<
:添加元素到末尾。
arr = [1, 2]
arr << 3
arr.push(4)
puts arr # 输出:[1, 2, 3, 4]
unshift
:添加元素到开头。
arr.unshift(0)
puts arr # 输出:[0, 1, 2, 3, 4]
pop
:移除并返回末尾元素。
puts arr.pop # 输出:4
puts arr # 输出:[0, 1, 2, 3]
shift
:移除并返回开头元素。
puts arr.shift # 输出:0
puts arr # 输出:[1, 2, 3]
delete
:删除指定元素。
arr.delete(2)
puts arr # 输出:[1, 3]
delete_at
:删除指定索引的元素。
arr.delete_at(0)
puts arr # 输出:[3]
查询与检查
length
或size
:返回元素个数。
arr = [1, 2, 3]
puts arr.length # 输出:3
empty?
:检查数组是否为空。
puts [].empty? # 输出:true
include?
:检查是否包含某元素。
puts arr.include?(2) # 输出:true
迭代与转换
each
:遍历数组。
arr = [1, 2, 3]
arr.each { |n| puts n * 2 } # 输出:2, 4, 6
map
或collect
:转换并返回新数组。
new_arr = arr.map { |n| n * 2 }
puts new_arr # 输出:[2, 4, 6]
select
:筛选符合条件的元素。
evens = arr.select { |n| n.even? }
puts evens # 输出:[2]
reject
:筛选不符合条件的元素。
odds = arr.reject { |n| n.even? }
puts odds # 输出:[1, 3]
排序与反转
sort
:排序(返回新数组)。
arr = [3, 1, 2]
puts arr.sort # 输出:[1, 2, 3]
reverse
:反转数组。
puts arr.reverse # 输出:[2, 1, 3]
- 带 ! 的方法:如
sort!
、reverse!
修改原数组。
arr.sort!
puts arr # 输出:[1, 2, 3]
合并与去重
concat
或+
:合并数组。
arr1 = [1, 2]
arr2 = [3, 4]
puts arr1 + arr2 # 输出:[1, 2, 3, 4]
arr1.concat(arr2)
puts arr1 # 输出:[1, 2, 3, 4]
uniq
:去除重复元素。
arr = [1, 1, 2, 2]
puts arr.uniq # 输出:[1, 2]
4. 多维数组
数组可以嵌套,形成多维数组。
matrix = [[1, 2], [3, 4]]
puts matrix[0][1] # 输出:2
matrix.flatten # 输出:[1, 2, 3, 4]
5. 数组与 Enumerable 模块
数组默认包含 Enumerable
模块,支持众多迭代方法(如 map
, select
, find
),需结合块使用。
arr = [1, 2, 3, 4]
puts arr.find { |n| n > 2 } # 输出:3(第一个满足条件的元素)
puts arr.sum # 输出:10(Enumerable 方法)
6. 注意事项
- 可变性:数组默认可变,修改方法(如
<<
,pop
)直接改变原数组。 - 冻结数组:用
freeze
使数组不可修改。
arr = [1, 2, 3].freeze
# arr << 4 # 错误:Cannot modify frozen Array
- 性能:大量操作时,注意
!
方法(如sort!
)可减少内存分配。 - 类型混合:数组元素可以是任意类型,但操作时需注意类型一致性。
arr = [1, "two", :three]
- 空数组:
arr = []
puts arr.empty? # 输出:true
7. 示例:综合应用
module ArrayUtils
def print_even
select { |n| n.even? }.each { |n| puts n }
end
end
class Array
include ArrayUtils
end
arr = [1, 2, 3, 4, 5]
arr.print_even # 输出:2, 4
puts arr.map { |n| n * 2 }.join(", ") # 输出:2, 4, 6, 8, 10
总结
Ruby 的数组是灵活且功能丰富的核心数据结构,支持多种创建方式和操作方法。通过 each
, map
, select
等迭代方法,结合 Enumerable
模块,数组处理简洁高效。注意数组的可变性以及 !
方法的使用,可以优化代码性能和可读性。
如果你有具体问题或需要更详细的示例,请告诉我!