Ruby 数组和散列

在Ruby中,数组(array)和散列(hash)这样保存对象的对象,被称为容器(container)。

数组(array)

数组(array)和一个按顺序保存多个对象的对象,是基本容器之一。一般称数组对象或Array对象。

数组采用 [ ] 括起,并且数组的每个元素之间使用逗号 , 分隔。数组中每个对象都有一个表示其位置的编号,称为索引(index)。通过索引,可以把对象存放到指定位置,也能够从数组的指定位置读取对象。

  • 在Ruby中,如果指定了数组中不存在的索引值时,则数组的大小会随之改变。这是因为Ruby的数组默认就是动态数组(大小按实际情况自动调整)

  • 任何对象都可以作为数组元素保存到数组中(时间、文件等对象也可以作为数组元素)

  • 数组元素可以是不同对象的混合保存

获取数组大小

使用 size 方法可以获得数组大小:

<array_name>.size

数组输出

Ruby提供了一个非常方便的数组迭代器,也就是 each 方法:

ruby的each方法可以方便对数组遍历操作,语法简洁
数组.each do |变量|
  希望循环的处理
end

each 方法输出示例:

ruby的each方法可以方便对数组遍历输出
book_name = ["一只", "特立独行的", "猪"]
book_name.each do |n|
  puts n
end

散列(hash)

散列(hash)是键值对 (key-value pair)的一种数据结构,一般以字符串或符号(symbol)作为键,来保存对应的对象。

在Ruby中,符号(symbol)和字符串对象很相似,符号也是对象,变作为名称标签来使用,用来表示方法等的对象的名称。

创建符号,只需要在标识符的开头加上 : 就可以了:

符号的案例
sym = :foo    # 表示符号 ":foo"
sym2 = :"foo" # 意思同上


另外,从ruby 1.9开始,符号(symbol)的表示方法有所简化,可以写成:

Ruby 1.9之后的symbol表示方法
# Ruby 1.9之后可以写成
user = { name: "Alice", age: 30 }

# 等同于
# user = { :name => "Alice", :age => 30 }

print user[:name]

字符串作为键和符号作为键的区别主要是性能和内存使用上的差异:

  • 字符串是可变的,每次创建一个字符串,即使内容相同也会在内存中创建一个新的对象。因此在使用字符串作为key的时候,每次查找键都会进行字符串内容对比,就会稍微慢一些

  • 符号(symbol)是不可变的,而且具有唯一性。相同的符号在内存中只会存在一个实例,因此使用符号作为键时,查找速度更快(查找时符号的对比是基于对象ID),内存使用也更高效。

散列的循环

ruby提供了 each 方法可以遍历散列中所有元素,逐个取出其元素的键和对应的值。循环数组时时按照索引顺序遍历元素,循环散列则按照键值对遍历元素。

each 方法遍历散列
user = { name: "Alice", age: 30 }

print user[:name]

user.each do |key, value|
  puts "#{key}: #{value}"
end

参考

  • 「Ruby基础教程」