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]

查询与检查

  • lengthsize:返回元素个数。
  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
  • mapcollect:转换并返回新数组。
  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 模块,数组处理简洁高效。注意数组的可变性以及 ! 方法的使用,可以优化代码性能和可读性。

如果你有具体问题或需要更详细的示例,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注