Ruby学习笔记:一、数据类型

今天老大问大家,谁有兴趣学习下Ruby,部门马上要有一个使用Ruby的项目。入职两个月,几乎每天都是做一些SQL优化或是JS优化,偶尔写一些功能模块。本来就是一直处于学习的状态,所以趁着这个机会,就来学习下Ruby好了。

很早之前就知道Ruby,也知道它是日本人松本行宏设计的。维基百科中描述Ruby,是1993年2月24日由松本行宏开始编写,直到1995年12月才正式公开发布于fj;是一种面向对象、命令式、函数式、动态的通用编程语言,遵守BSD许可证和Ruby License。Ruby是取法与Perl的,因为Perl的发音与6月的诞生石pearl(珍珠)相同,所以Ruby以7月的诞生石ruby(红宝石)命名。

大多数语言都是共通的,作为一门支持面向对象的语言,我想学习Ruby的大概路线应该是环境搭建、数据类型、运算符、流程控制、类、标准库、开源框架等等吧。因为是在Windows环境中安装的Ruby,也就是傻瓜式的一路next,环境搭建的过程就不做介绍了。

Numbers(数字型)
Ruby的数字类型支持整数和浮点数,与Java不同的是,Ruby的整数不受CPU位数限制,可以是任何长度(直到耗尽你的系统内存)。在一个确切范围内(通常是-2的30次方到2的30次方-1,或者是-2的62次方到2的62次方-1),整数的实质是一个二进制段,是类Fixnum的实例对象;但是在这个方位之外,整数被存储为类Bignum的实例对象(当前实现为一个可变长度的短整数集合)。这个实现对开发者来说是透明的,Ruby会自动管理整数的向上转型或向下转型。以下都是一些合法的整数:
Fixnum 8
Fixnum 64
Fixnum 4096
Fixnum 16777216
Bignum 281474976710656
Bignum 79228162514264337593543950336
Bignum 6277101735386680763835789423207666416102355444464034512896
整数由一个可选的引导标志、一个可选可选的进制标志(八进制以0开头,十六进制以0x开头,二进制以0b开头)以及紧随其后的一些数字字符组成。以下都是一些合法的整数:
123456                    # Fixnum
123_456                   # Fixnum (underscore ignored)
-543                      # Negative Fixnum
123_456_789_123_345_789   # Bignum
0xaabb                    # Hexadecimal
0377                      # Octal
-0b101_010                # Binary (negated)
如果一个数字中存在小数点,它将被转成浮点数类型。在浮点数的小数点后必须跟着的是一个数字,像1.e3这样的数字,会被Ruby理解为类Fixnum的e3方法。

所有的数字都是对象,所以,区别于C/C++,如果要得到一个数字的绝对值,只需要写作aNumber.abs,而不是abs(aNumber)。

整数同时也支持一些有用的迭代器,包括times、upto、downto以及step等等。times可以实现指定循环次数,upto和downto则表示数字增到或降到某个整数,step与传统的循环类似,给出两个参数分别是终止条件和步长。尝试如下代码:
3.times        { print "X " }
1.upto(5)      { |i| print i, " " }
99.downto(95)  { |i| print i, " " }
50.step(80, 5) { |i| print i, " " }
输出如下:
X X X 1 2 3 4 5 99 98 97 96 95 50 55 60 65 70 75 80
Strings(字符串类型)
Ruby中字符串是简单的八位字节的序列,通常由可打印的字符组成。但这不是必须的,字符串也可以包含一些二进制数据。字符串是类String的实例对象。

字符串通常使用字符字面量创建,即由引号括起来的字符序列。如果是单引号括起来的字符串包含一些二进制数据,可以使用反斜线符号进行转义。比如\\会被转义为\,而\'则被转义为'。

双引号括起来的字符串支持更多的转义序列,最常见的可能是换行符"\n"。另外,也可以在字符串中通过#{表达式}使用Ruby表达式。如果这个表达式是一个全局变量、类成员变量或者实例对象变量,大括号是可以省略的。如下是一些例子:
"Seconds/day: #{24*60*60}"	»	Seconds/day: 86400
"#{'Ho! '*3}Merry Christmas"	»	Ho! Ho! Ho! Merry Christmas
"This is line #$."	»	This is line 3
Ruby中有三种方式创建字符串:%q、%Q和"引号方式",%q和%Q可以指定字符串的界定符。例如:
%q/general single-quoted string/	»	general single-quoted string
%Q!general double-quoted string!	»	general double-quoted string
%Q{Seconds/day: #{24*60*60}}	»	Seconds/day: 86400
紧跟着q或Q后的字符就是界定符,如果这个字符是打开的(、{、<等,那么字符串会一直读取到与之匹配的关闭字符被发现为止()、}、>等);否则,字符串会读取到下一次出现相同的字符为止。

最后,还可以使用如下方式创建一个字符串:
aString = <<END_OF_STRING
    The body of the string
    is the input lines up to
    one ending with the same
    text that followed the '<<'
END_OF_STRING
Ranges(范围)
Ruby中,Ranges有三种用法:序列、条件和区间。

第一种也是最自然的用法就是表示一个序列。序列包括一个起点,结束点以及一种产生连续值的方式。Ruby使用两个点号(..)或者三个点号(...)来产生一个序列,点号的两侧分别是序列的起始点和结束点。其中两个点号的序列包含点号后的最高值,而三个点号的序列表示的范围不包括点号后的最高值。
1..10
'a'..'z'
0...anArray.length
如上,第一个序列范围包括从1到10十个数字,第二个序列包括从字母a到字母z二十六个字母,而序列三因为是使用三个点号的序列,表示的范围是从0到anArray.length - 1,不包括anArray.length这个最大值。

Ranges的to_a方法可以很轻松的将一个序列转换为list类型,如下:
(1..10).to_a	»	[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
('bar'..'bat').to_a	»	["bar", "bas", "bat"]
当然,Ranges还实现了其他一些很有用的方法,以方便迭代或测试它的内容。
digits = 0..9
digits.include?(5)	»	true
digits.min	»	0
digits.max	»	9
digits.reject {|i| i < 5 }	»	[5, 6, 7, 8, 9]
digits.each do |digit|
  dial(digit)
end
Ranges的第二种用法是作为条件。下面的代码段会接收来自于标准输入的字符串,当字符串是以“start”开头,并且以“end”结尾时,就会将这个字符串打印出来。
while gets
  print if /start/../end/
end
例如输入"start 任意字符 end",程序就会直接将这个字符串输出。

Ranges的最后一种用法是区间,用于测试一些取值是否落在这个区间内,这个判断需要用到===运算符。
(1..10)    === 5	»	true
(1..10)    === 15	»	false
(1..10)    === 3.14159	»	true
('a'..'j') === 'c'	»	true
('a'..'j') === 'z'	»	false
Regular Expressions(正则表达式)
Ruby中创建正则表达式对象有三种方法,一是使用构造函数创建。正则表达式是类Regexp,所以这种创建方式的代码形式就是Regexp.new('^\s*[a-z]')。第二种创建正则表达式的方法与js类似,使用两个反斜杠,比如/^\s*[a-z]/,这与第一种方式得到的是相同的正则表达式。还有一种是对第二种的扩展,与字符串使用%q或%Q相似,也可以使用%r加上一个界定符来创建正则表达式,如%r{^\s*[a-z]}。

一旦持有一个正则表达式对象,就可以通过Regexp#match(aString)或者匹配运算符=~(位置匹配)、!~(不匹配)等进行匹配操作。这些运算符作用于字符串和正则表达式对象,如果运算符两侧都是字符串,那么右侧的字符串将会被转换为正则表达式对象。
a = "Fats Waller"
a =~ /a/	»	1
a =~ /z/	»	nil
a =~ "ll"	»	7
这些匹配操作返回的是发生匹配的字符位置。另外,在Ruby的正则表达式中,$&接收了被匹配字符序列之前的部分,$`接收了被匹配的字符串序列,$'接收了被匹配字符序列之后的部分。以上面的字符串a = "Fats Waller"为例,做a =~ /ll/匹配后,$`保存的内容就是匹配到字符串"ll",$&保存的则是处于"ll"之前的字符序列"Fats Wa",同时$'保存的就是处于"ll"之后的字符序列"er"。

Ruby的正则表达式中,如果要引用之前的分组,可以使用\1、\2等向前引用;而在匹配到的结果中,使用$N来获取并使用匹配到的分组,其中N从1开始。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值