Ruby数据类型
转自[foreverphoenix的专栏]
数字
1、Ruby支持整数和浮点数。整数可以使任何长度。一定范围内的整数是Fixnum类的对象。范围之外的整数存储在Bignum类的对象中。这种处理是透明的。
2、可以在一个ASCII字符前加一个问号来获得其对应的整数值。Ctrl组合键可以由?/C-x或?/cx(x&0x9f)来产生。Meta字符(x|0x80)可以由?/M-x来产生。
3、一个带有小数点"或/和"指数的数字字面量被认为是Float对象。Float对象和本机上的double类型大小一样。
4、Float精度有限,若需要更好精度的小数,可以使用标准库中BigDecimal,但效率会受影响。
字符串
1、字符串字面量中可以放置各种转义序列。字符串分界符的类型决定了要被替换的程度。在单引号字符串中,只识别反斜线和单引号的转义。双引号字符串支持更多的转义字符,还可以使用#{expr}把任何Ruby表达式的值放进字符串中,其中如果expr是全局变量、类变量或实例变量的话,花括号可以忽略。
2、另外有三种构建字符串字面量的形式:%q(相当于单引号),%Q(相当于双引号),here document。跟在q或Q后面的字符是分界符。分界符可以是任何一个非字母数字的单字节字符。字符串被一直读取直到出现下一个相同的(对({[<来说是对应的闭合符号) 分界符。Here document由源文件中的那些行但没有包含在<<字符后面指明终结字符串的行组成。一般情况下终结符必须在第一列出现。如果把一个减号-放在<<字符后面,就可以缩进编排终结符。分隔符可以跨越多行,行结束符以及后续行开始处的空格都被包含到字符串中。
3、其他用于字符串的分隔符还有%w(%W)生成字符串数组,%x执行shell命令,%r生成正则表达式。
4、Ruby字符串是8位字节序列。如果处理Unicode编码,需要加入以下代码:(jcode库覆盖了String类中大多数方法用来处理多字节文本) $KCODE='u' require 'jcode'
5、正则表达式的三种表达方式:1)/regular_expression/ 2)Regexp.new(“regular_expression”) 3)%r{regular_expression}
区间
1、区间作为序列,”..”的形式是创建闭合的区间(包括右端的值),”…”的形式是创建半闭半开区间(不包括右端德值)。
2、可以用自定义的对象来创建区间,条件是这些对象必须实现succ方法和<=>。
3、区间作为条件使用,当区间的第一部分的条件为true时打开,当区间的第二部分的条件为true关闭。两点的range在第一次从关变为开时,会立即求解结束条件,并相应地变迁状态。这意味着如果expr1和expr2在一个调用中都为真,那么两点形式的调用将结束于关状态。不过该调用仍返回真。三点形式的range不会在进入开状态后立即求解结束条件。
4、区间作为间隔,测试某些值是否会落入区间表达的间隔内。使用===操作符比较。
数组
1、数组类的字面量是在方括号间由逗号分隔的一连串对象引用组成的。对于全部是字符串对象的数组,可以用简写形式%w和%W来构成。%w形式将空格隔开的token提取为连续的数组元素,在单个字符串内不执行替换。%W形式对每个token执行和双引号字符串一样的替换规则,空格可以用反斜线转义。
2、通过[index]访问数组元素,第一个元素索引为0。索引可以为负值,-1表示最后一个元素。
散列表
1、散列表的初始化有两种方式:{}中用key=>value的形式,[]中连续放置key,value,中间用逗号隔开。
2、散列表中的键如果使用equ?比较相等,那么这两个键必定具有相同的散列码。如果把自定义类的对象实例作为hash键,那么需要确保1)一旦对象被创建,它的散列码就不再改变;2)每当键的散列码发生变化时调用Hash#rehash方法重新对散列表进行索引。
符号
1、Ruby中Symbol 表示“名字”,比如字符串的名字,标识符的名字。创建一个Symbol对象的方法是在名字或者字符串前面加上冒号。每个String对象都是不同的,即便他们包含了相同的字符串内容;而对于Symbol对象,一个名字(字符串内容)唯一确定一个Symbol对象。名字相同,则Symbol相同;名字不同,则Symbol不同。Symbol对象一旦定义将一直存在,直到程序执行退出。所有Symbol对象存放在Ruby内部的符号表中,可以通过类方法Symbol.all_symbols得到当前Ruby程序中定义的所有Symbol对象,该方法返回一个Symbol对象数组。