最近在学习Programming Ruby,做点读书笔记来记录下自己的成长也是不错的。当然更希望的是各位大牛能指出本人的不足,在这里先谢谢大家了。
第一章 入门
讲的是如何安装Ruby,在Ruby的官方网站上有很详细的安装指南,无论你是Liunx,Windows还是Mac,总有办法适合你。
第二章 Ruby.new
作者在这章给大家介绍了下Ruby的一些基本特性。摘录如下:
2.1 Ruby是一门面向对象语言
在Ruby中,通过调用构造函数(constructor)来创建对象,这是一种与类相关联的特殊方法。标准的构造函数被称为new。
Song1 = Song.new(“Ruby Tuesday”)
通过构造函数,可以发现Ruby和大多数别的语言之间的一个很大的差别。例如在Java中,是通过调用另外一个函数来得到某些成员数据的绝对值,并把结果传回数据本身,Java中求绝对值可以这么写:
number = Math.abs(number);
而在Ruby中,确定绝对值的能力内建在数字中——处理细节在内部实现中。只要发送abs消息到一个数字对象,让它去得到绝对值即可。
number = number.abs
个人认为就是因为这种特性,作者才会认为Ruby是真正的面向对象语言。
2.2 Ruby的一些基本知识
方法(method)用关键字def定义,后面跟着方法名称和在括号中的方法参数,Ruby没有使用话括号来界定复杂的语句和定义的程序体。可以使用end结束这个程序体。
最常用的创建字符串对象的途径可能是使用字符串字面量(literals),即一组单引号或双引号之间的字符序列。
Ruby对单引号处理得很少。除了极少的一些例外,键入到字符串字面量的内容就构成了这个字符串的值。
Ruby对双引号字符串有更多的处理。首先寻找以反斜线开始的序列,并用二进制值替换它们。其中最常见的是\n,它会被回车换行符替换掉。其次是字符串内插(expression interpolation),#{表达式}序列会被“表达式”的值替换。
Ruby方法返回的值,是最后一个被求值的表达式的值,所以有时候可以省略return语句。
Ruby的命名惯例:
局部变量、方法参数和方法名称都必须以小写字母或下画线开始。
全局变量以$为前缀,实例变量以@为前缀,类变量以@@为前缀。
类名称、模块名称和常量都必须以一个大写字母开始。
包含多个单词的实例变量名称在词与词之间使用下画线连接,包含多个单词的类变量名称使用混合大小写(每个单词首字母大写),方法名称可以?、!和=字符结束(不同的字符代表的意义不一样)。
2.3 数组和散列表
使用数组字面量(array literal)——即方括号之间放一组元素——可以创建和初始化新的数组对象。Ruby数组的索引从零开始。
Ruby中用nil表示没有任何东西的对象,有点类似Java里面的null。但是要注意,在Ruby中,nil是一个对象。
散列表字面量(hash literal)使用花括号。这个字面量必须为每一项提供两个对象:一个键(key)和一个值(value)。
2.4 控制结构
Ruby具有常见的控制结构,如if语句和while循环。另外Ruby中这些语句的程序体没有花括号,使用end关键字来表明程序体的结束。
如果if或while语句的程序体只是一个表达式,Ruby的语句修饰符(statement modifiers)是一种有用的快捷方式。只要写出表达式,后面跟着if或while和条件。这点跟Perl类似。
2.5 正则表达式
正则表达式只是一种指定字符模式的方法,这个字符模式会在字符串中进行匹配。
在Ruby中,正则表达式是对象并且可以当作对象来操作。
=~匹配操作符可以用正则表达式来匹配字符串。如果在字符串中发现了模式,=~返回模式的开始位置;否则返回nil。因此可以在if或while语句中把正则表达式当作条件使用。
2.6 Block和迭代器
Block是一种可以和方法调用相关联的代码块。可以用它实现回调,传递一组代码,以及实现迭代器。
Block只是在花括号或者do_end之间的一组代码。
一旦创建了Block,就可以与方法的调用相关联。把Block的开始放在含有方法调用的源代码行的结尾处,就可以实现关联。
使用yield语句,方法可以一次或多次地调用(invoke)相关联的Block。
可以提供参数给对yield的调用:参数会传递到Block中。在Block中,竖线(|)之间给出参数名来接受这些参数。
在Ruby的库中大量使用了Block来实现迭代器:迭代器是从某种容器(collection)如数组中连续返回元素的方法。
2.7 读/写文件
Ruby有一个完备的I/O库。
puts输出它的参数,并在每个参数后面添加回车换行符。
print也输出它的参数,但没有添加回车换行符。
printf,在格式化字符串的控制下打印参数。
gets,从程序的标准输入流读取下一行。