Collections : 用于存储元素(element),Arrays & Hashes就是 collections,这里的元素可以是任意类型的,注意我强调的是:element是任意类型的对象的,而不是说Arrays Hashes保存特定类型的对象,这有什么区别呢?比如:arr = [1,"happy",123.22] 是可行的。最后强调一个术语:key,key提供了访问element的途径,访问的时候使用必须使用 key,Arrays和Hashes的key是有区别的,实际上,Hashes的key更加灵活。
Arrays的例子:
a = [ 1, 'cat', 3.14 ] #Arrays使用[],这样的表现形式,[ 1, 'cat', 3.14 ] 被叫做 array literal
a[0] → 1 #Arrays的key从0开始
a[0] = nil #nil 是一个表示没有对象的对象,也就是说nil本身是一个对象
*请不要小看literal这个术语,object 的create & initialize都要使用到 literal,因为ruby里面是不能声明变量的,虽然我们还有别的方式,比如new方法
Array:
1. key必须是整数类型的对象
2.Arrays的特殊用法,%w,例:
a = [ 'ant', 'bee', 'cat', 'dog', 'elk' ]
a[0]→"ant"
a[3]→"dog"
# this is the same:
a = %w{ ant bee cat dog elk } #使用%w,里面的元素都不需要引号,解释器认为里面全部为字符串
#%w{}是上面完全的替代品,也就是说,元素只能是字符串的(即里面的元素都是'xxx'而不是"xxx".不支持转义字符和#{})
a[0]→"ant"
a[3]→"dog"
值得提醒的是我们前面说过的,对字符串的解析
a = ["hi"]
b = ["hi\n"]
c = ["hi#{1}"]
这些都是允许的表达
对于%w:
a = %w{hi\n}
puts a[0]
^Z
hi\n #不支持转义字符和#{},也就是%w{}中的字符串,都是 ' 引起来的
Hashes:
1.Hashes的key,value可以为任意的object
2.Hashes literal 使用大括号:
{
'cello'=> 'string', #其中 => 的左边为 key,右边为value(值)
'clarinet' => 'woodwind',
'drum'=> 'percussion',
'oboe'=> 'woodwind',
'trumpet'=> 'brass',
'violin'=> 'string'
}
举例:
inst_section = {
'cello'=> 'string', #这里不单单可以使用 ' 也可以使用 "
'clarinet' => 'woodwind', #key必须唯一
'drum'=> 'percussion',
'oboe'=> 'woodwind',
'trumpet'=> 'brass',
'violin'=> 'string'
}
inst_section['oboe']→"woodwind"
inst_section['cello']→"string"
inst_section['bassoon']→nil #key 不存在的时候返回nil
有趣的事情出来了,我们可以这样使用:
$state = "dynamic value"
a = {
"#$state" => 'sd'
}
puts a["dynamic value"]
这样,我们就动态的分配了一个key值,以后我们会发现它的好处,这里在补充一下,'xxx'与"xxx"的区别,我们可以这样理解:任何"xxx"都将被转换成为'xxx'来运行,所以'abc'=="abc",但是"xxx"接受转义字符和#{},而且速度比 ' 的慢(具体慢的程度,无法考证,也没有研究,本人也对此持有保留态度)
最后说一下nil,nil在条件表达式里面,表示false