Ubuntu 11.10已经内置了Ruby,这个还蛮好的,嘎嘎
第二章 编程等于快乐:Ruby和面向对象概览
irb:交互式Ruby,输入就有结果的交互式环境(即时反馈)
与其他语言中对类的定义一样,Ruby中类名永远用大写字母开头
irb(main):001:0 最末尾的数字表示代码深度,也就是处于多少层的意思
用print和puts都可把内容打印到屏幕。其中puts命令会自动把输出光标放到下一行,而print在上次的光标位置继续打印文本。
Ruby中类的继承非常简单明了,就是建立了父类,子类会继承它所有属性,而且也一目了然。
一切都是对象:在Ruby中,几乎一切都是对象,任何操作都可以看作是通过方法来实现的。比如,计算加减法是使用内置类Fixnum的对象。我们也可以向Fixnum类增加自己的方法。
Kernel模块(注:Ruby中的Kernel模块只是代表“核心”,跟操作系统中的内核毫无关系)中的方法在Ruby的每个类和有效范围内都可使用。比如puts,而且不需要写出完整的命令,因为Kernel模块是被默认包含和搜索的。puts方法只接受一个自由变量。
第三章 Ruby的构造元素:数据、表达式和流程控制
Ruby提供了一种巧妙的手段,用between?方法来判断某对象是否处于指定的两个值之间,是则返回true。例如,age.between?(12,20)。
在Ruby中要执行一个循环操作,可以使用下列times方法,比如
5.times do ... end 或者 5.times {...}
Ruby中有一种创建循环的机制,叫做迭代子(iterator)。所谓迭代子,是指在列表条目中逐步递进的东西。
迭代子可以上溯,可以下溯,还可以调用step方法,比如
1.upto(5){...} 10.downto(5){...} 0.step(50,5){...}
如果字面字符串包含有多行,那么就应该使用%q{和}
也可以用引入文档(here document)来构建字面字符串。<<标记着字面字符串的开始,后接所选择的分界符,分界符甚至可以是一串单词哦
插写(interpolation)是指表达式结果插入字面字符串的过程。在字符串中插写的方式,是把表达式放在#{和}符号中。
当然,不用插写方式,把表达式放到字符串之外,也可以得到和前面相同的结果。
------------------------------------------------正则表达式------------------------------------------------
替换:sub方法替换第一次遇到的指定内容,gsub替换所有的指定内容
正则表达式中基本的特殊字符和符号
字符 | 含义 |
^ | 用于行开始的锚 |
$ | 用于行结束的锚 |
\A | 用于字符开始的锚 |
\Z | 用于字符结束的锚 |
. | 任意字符 |
\w | 任何字母、数字或下划线 |
\W | 不匹配\w的任何内容 |
\d | 任何数字 |
\D | 不匹配\d的任何内容(非数字) |
\s | 空白(空格、制表符、换行符等) |
\S | 非空白(任何可见字符) |
修饰符 | 说明 |
* | 匹配零次或多次前面紧跟的字符,并尽可能多地匹配 |
+ | 匹配一次或多次前面紧跟的字符,并尽可能多地匹配 |
*? | 匹配零次或多次前面紧跟的字符,并尽可能少地匹配 |
+? | 匹配一次或多次前面紧跟的字符,并尽可能少地匹配 |
? | 要么匹配一次,要么全不匹配前面紧跟的字符 |
{x} | 匹配x次前面紧跟的字符 |
{x,y} | 匹配最少x次、最多y次前面紧跟的字符 |
=~是匹配查询运算符,如果字符串与运算符后面的正则表达式能够匹配,则该表达式结果为true。
String类提供的名为match的方法,提供了更为强大的能力。
---------------------------------------------------数组---------------------------------------------------
数组不需要设置预定义空间,或手工分配元素。
在Ruby中,可以使用“压入数据”的方法,向数组末尾加入内容。比如使用“<<"或者调用push方法
x = [ ]
x << "Word"
数组是先进先出系统,数据既能被压入数组末尾,也能从数组末尾弹出(弹出是从数组末尾检索数据并同时将其删除的过程),调用pop方法可以将元素弹出
如果数组中全都是字符串,可以对该数组调用名为join的方法,将所有元素连接起来形成一个大字符串。
join方法可接受一个可选参数,放在结果字符串的每个元素之间。
split方法可以将字符串切分成字符串数组
inspect方法可以直接打印输出
数组中迭代的方法很简单,each方法遍历数组中的每个元素,把该元素当作参数,传递给用户提供的代码块。
collect方法在数组中逐个元素地进行迭代,并用代码块中表达式的结果,对该元素进行赋值。
数组的其他操作:数组加法和串连(也就是合并)+
数组减法 -
检查数组是否为空 empty
检查数组是否有某个元素 include?
访问数组第一个和最后一个元素 first last
反转数组元素的顺序 reverse.inspect
------------------------------------------------------散列表-------------------------------------------------------
散列表中的对象不在列表中给定位置,而是给定一个指向对象的键(key)。散列表更像字典,而不像列表,因为它没有确定的顺序,只有键和值之间的简单链接。比如:
dictionary = { 'cat' => 'feline animal', 'dog' => 'canine animal' }
其中=>前为键,后为值
散列表可以被看作为数组,其元素具有名字,而非位置序号。我们甚至可以用与数组相同的方法,来改变散列表元素的值。
检索键:(x是散列表)x.keys.inspect
删除元素:x.delete(" “)
散列表中有可能使用散列表(或任何类型的对象),甚至数组,甚至散列表中的散列表作为元素。
---------------------------------------------------流程控制-------------------------------------------------------
if和unless可以根据条件执行不同的操作来控制程序流程
Ruby中还提供了elsif表示“否则如果”,case...when来分条件处理
each方法接受单个代码块作为参数,该代码块的定义位于{和}符号之间,或位于do和end之间。我们可以自己编写方法来处理代码块,或者使用yield方法(它能自动检测传递给它的代码块,并将控制权移交给该代码块,也可以用lambda方法,把代码块存储在变量中。
其他:
Ruby提供了Time类来处理日期和时间。
Time类允许根据任意日期创建Time对象
Time.local(year,month,day,hour,min,sec,msec)
在Ruby中,过于大的数字交给Bignum类处理
Ruby中的符号相当独特,它不包含值或对象,不像变量那样,而是用作代码中固定的名字。符号可以减少内存占用,而且使代码更为简洁。