关闭

Ruby 数据类型

184人阅读 评论(0) 收藏 举报
分类:

Ruby 数据类型


数字

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方法重新对散列表进行索引。

符号

Ruby中Symbol 表示“名字”,比如字符串的名字,标识符的名字。创建一个Symbol对象的方法是在名字或者字符串前面加上冒号。每个String对象都是不同的,即便他们包含了相同的字符串内容;而对于Symbol对象,一个名字(字符串内容)唯一确定一个Symbol对象。名字相同,则Symbol相同;名字不同,则Symbol不同。Symbol对象一旦定义将一直存在,直到程序执行退出。所有Symbol对象存放在Ruby内部的符号表中,可以通过类方法Symbol.all_symbols得到当前Ruby程序中定义的所有Symbol对象,该方法返回一个Symbol对象数组。

#{},和 ${}传参的区别,

    使用#传入参数是,sql语句解析是会加上"",比如  select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是

     select * from table where name = ‘小李’,就是会当成字符串来解析,这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入,如果你传入的参数为 单引号',那么如果使用${},这种方式 那么是会报错的,

双冒号是定义 name space 用的,或者叫 scope

当你使用 Foo::Bar 的时候,实际你是在找一个名字叫 Foo 的 namespace ,然后让它返回它里面的 Bar 参数 , 这个 Bar 可以是个常量,可以是个类,可以是个方法 (后两者在 Ruby 中可视为常量)

同理使用 FooBar::method1 的时候实际上是在要求返回 FooBar 这个 namespace 中 method1 这个「常量」的值。

使用 FooBar.method1 的时候则是在调用这个方法,当然返回结果是一样的,这里 :: 和 . 确实是可以互换不影响结果。但 :: 只能用来找 class method , instance method 就只能用 . 了

另外 :: 还能用来找真正的常量,比方这样
如果 Foo::小写(new,test)—->就去需找方法
如果 Foo::大写(A,VERSION)—>就去寻找常量


to_s 必须强制转换

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:32950次
    • 积分:1741
    • 等级:
    • 排名:千里之外
    • 原创:135篇
    • 转载:46篇
    • 译文:7篇
    • 评论:2条
    文章分类
    最新评论