Ruby 数组和散列
在Ruby中,数组(array)和散列(hash)这样保存对象的对象,被称为容器(container)。
数组(array)
数组(array)和一个按顺序保存多个对象的对象,是基本容器之一。一般称数组对象或Array对象。
数组采用 [ ]
括起,并且数组的每个元素之间使用逗号 ,
分隔。数组中每个对象都有一个表示其位置的编号,称为索引(index)。通过索引,可以把对象存放到指定位置,也能够从数组的指定位置读取对象。
在Ruby中,如果指定了数组中不存在的索引值时,则数组的大小会随之改变。这是因为Ruby的数组默认就是动态数组(大小按实际情况自动调整)
任何对象都可以作为数组元素保存到数组中(时间、文件等对象也可以作为数组元素)
数组元素可以是不同对象的混合保存
获取数组大小
使用 size
方法可以获得数组大小:
<array_name>.size
数组输出
Ruby提供了一个非常方便的数组迭代器,也就是 each
方法:
数组.each do |变量|
希望循环的处理
end
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之后可以写成
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基础教程」