containers: objects that hold references to one or more other objects.(container is a set of references)
arrays --- container
Array literals:
表现形式:
[1,2,3]
['a','b','c']
index我们常常也叫做key,使用index获取数组elements:
1.获取单个element:
a = ["my","you","it"]
a[0] #值是"my"
a[1] #值是"you"
a[2] #值是"it"
先来说一下indices,对于一个array,我们可以认为array elements从0开始,一直到array的长度减1,也可以认为数组最高位置为-1,以后的每个都减去1,比如:
a[0] == a[-3] #true
a[2] == a[-1] #true
我们为什么要使用负的indices? 因为除了从0开始检索这样的情况,我们有时候还需要从最大的位置开始检索,这时通常的做法是需要求得array的elements的数量,然后使用,我们知道,这样的方式不是直接的,而ruby是一种简洁的语言,这样的一种检索方法,也就是ruby简洁的一种表现,举例:
indices: 0 1 2 3 4 5 6
-7 -6 -5 -4 -3 -2 -1
a = ['ant','bat','cat','dog','elk','fly','gnu']
这里"[]"是一个operator,就像"+","-"一样,对于一个operator,它实际上是class里面的一个method,注意,当index或者说是key的值超过了界限,比如说:
test = ['first ','second ','third ']
puts test[0],test[1],test[2],test[3] #test[3]得到一个nil的值
结果:
first
second
third
nil
2.获取多个elements:
数组还可以使用这样的index [start,count],得到的结果将是array object,例如上面的 test array:
test2 = test[0,2]
结果test2为:['first ','second ']
同时,我们也可以使用Range Object来取得多个elements,得到的结果将是一个array object:
test2[0..1] #结果为['first ','second ']
*强调一下,所有的[],里面操作的都是keys的集合(也叫做indices)
数组赋值操作:
这里补充一下,数组的长度求法: a.length
前面已经提到了"[]"这个operator,作用是取得array里面的elements,同样对应的"[]="这个operator,作用是为特定的数组位置赋值,下面详细说明:
a = [ 1, 3, 5, 7, 9 ] →[1, 3, 5, 7, 9]
a[1] = 'bat' →[1, 'bat', 5, 7, 9]
a[-3] = 'cat' →[1, 'bat', 'cat', 7, 9]
a[3] = [ 9, 8 ] →[1, 'bat', 'cat', [9, 8], 9]
a[6] = 99 →[1, 'bat', 'cat', [9, 8], 9, nil, 99]
#可以在arrays不存在的位置里面使用赋值(调用[]=method),比如最后的一次操作,这时候a[5]位置为nil
a = [ 1, 3, 5, 7, 9 ] →[1, 3, 5, 7, 9]
a[2, 2] = 'cat' →[1, 3, 'cat', 9]
a[2, 0] = 'dog' →[1, 3, 'dog', 'cat', 9]
a[1, 1] = [ 9, 8, 7 ] →[1, 9, 8, 7, 'dog', 'cat', 9]
a[0..3] = [] →['dog', 'cat', 9]
a[5..6] = 99, 98 →['dog', 'cat', 9, nil, nil, 99, 98]
#通过[start,count],[a..b]这样的形式赋值,改变的是elements,假如是赋值对象是array,被赋值的部分是array里面的elements,a[0..3]=[]这里[]表示空element,空element是需要会被移除的,因为array的element不允许是空element
1.[start,count]形式:
array_name[start,count],先删除 array_name 中 indices 在[start,count]中的elements,然后从start开始添加array_name[start,count]=后面的值,值可以是一个,也可以是多个,使用逗号分开,如果是array,这个array会被拆分它的elements
2.[Range object]形式:
和[start,count]类似,也是先删,后添