第二章 Ruby程序的结构和运行
-
Ruby的注释以#开头,并持续到该行结束。Ruby没有/*...*/的C风格注释。
-
如果#出现在字符串或者正则表达式的字面量里,则它是字符串或者正则表达式的一部分,而不是注释。
-
Ruby支持嵌入式注释,以=begin开头,以=end结尾。=begin和需要注释的内容之间至少要有一个空格作为分界符。=end也是如此,而且=end所在行,整行都是被注释掉的。=必须作为该行的第一个字符出现,前面连空格或制表符都不可以有。
-
文档化的注释
-
字面量 就是直接出现在Ruby源代码中的值,包括数字、字符串、正则表达式、数组、哈希值等。
-
标识符 即名字。Ruby用标识符对变量、类、方法等命名。
1)可以有字母、数字、下划线组成,但不能以数字开头。
2)以大写字母开头的标识符是常量。如果修改类似的标识符,会发出警告,但不是错误。
3)类和模块名必须以大写开头,否则报错。
4)非常量多字节标识符,以下划线分割,而不是java下通常的“驼峰命名”。
-
Ruby是大小写敏感的。
-
ASCII字符集下,Ruby规定了哪些字符是有效的,哪些是无效的。ASCII字符集之外的所有字符都是Ruby标识符的有效字符。比如UTF-8中的乘号“×”。
-
标识符里的标点符号
1)$ 开头的变量是全局变量;
2)@ 开头的变量是实例变量;
3)@@ 开头的变量是类变量;
4)? 返回布尔值的方法的名字通常以问号结尾;
5)! 结尾的方法名,表明此方法会改变调用它的对象本身;
6)= 如果方法名以=结尾,则调用此方法时,可以省略此等号,这种方法通常被置于赋值操作符的左侧。
-
保留字
__LINE__ case ensure not then __ENCODING__ class false or true __FILE__ def for redo undef BEGIN defined? if rescue unless END do in retry until alias else module return when and elseif next self while begin end nil super yield break =begin =end __END__
-
如果__END__单独出现在一行(没有前置或后置空白),则标示程序结束,即数据区的开始。
-
可以通过在保留字前加上@、@@、$,从而当做实例变量、类变量、全局变量来使用。此外还可以将关键字作为方法名,但这种方法名不能单独出现在程序中,必须通过一个对象显示的来调用。
-
Ruby的许多特性实际上是用Kernel、Module、Class和Object这几个类的方法来实现的。建议将以下标识符当做保留字来处理。
1) 这些方法通常用于声明或者关键字
at_exit catch private require attr include proc throw attr_accessor lambda protected attr_reader load public attr_writer loop raise
2) 这些方法通常用于全局方法
Array chomp! gsub! select Float chop iterator? sleep Integer chop! load split String eval open sprintf URI exec p srand abort exit print sub autoload exit! printf sub! autoload! fail putc syscall binding fork puts system block_given? format rand test callcc getc readline trap caller gets readlines warn chomp gsub scan
3)这些方法通常用于对象方法
allocate freeze kind_of? superclass clone frozen? method taint display hash methods tainted? dup id new to_a enum_for inherited nil? to_enum eql? inspect object_id to_s equal? instance_of? respond_to? untaint extend is_a? send
-
空白符
1)Ruby中可以使用分号来结束语句,但通常都被省略。如果省略,则换行符被视为语句的终结。
2)如果语句分布在多行,则应注意换行符的位置。
total = x + y total = x + y
3)以下情形不必担心换行符所引起的歧义。在操作符之后;在方法调用的句点之后;在数组或哈希表字面量里的分隔元素的逗号之后。
4)可以在换行符之前加上“\”进行转义,避免终结语句。
5)在Ruby1.9中,如果一行代码的第一个非空白字符是“.”,则该行被认为是上一行的延续。这种风格很符合链式调用。
6)Ruby允许省略方法调用中的括号,但应注意方法名和参数之间的空格。
f(3+2)+1 # equals to f(5) + 1 f (3+2)+1 # equals to f(6)
因此不要在方法名和左括号之间留白;如果参数是以圆括号开头,则整个方法调用一直要使用圆括号;最好一直使用Ruby解释器的-w选项。
-
块(block)是一段与迭代器相关的代码,以花括号或者do、end来分隔。(块的代码多于一行的时候,使用do、end来分隔)
3.times {print "Ruby! "} 3.times do |x| print x end
-
体(Body)是一个语句列表,如类定义体,方法体循环体等。体从不使用花括号分隔,而只使用关键字。
-
文件结构
1)如果含有“shebang”注释,则该注释必须出现在文件首行;
2)如果含有“coding”注释,则应该出现在“shebang”下面一行;如果没有“shebang”,则应出现在首行;
3)如果文件包含一行代码,且该行代码只包含__END__标记,且标记前后均无空白符,则Ruby解释器将停止对该文件的处理。文件余下部分可以包含任何数据,而且程序可以通过IO流对象DATA对其进行读取。
-
Ruby支持Unicode等其他字符集编码;1.8中需要-Ku选项,1.9中只需在文件开头加上以下注释(此注释必须用ASCII字符编写):
# coding: utf-8
1)coding后必须接一个冒号或等号,然后再接字符编码名称,该名称不能包含空格,也不能包含下划线和连字符以外的标点符号;
2)冒号和等号两边可以存在空格,字符串coding前面还可以包含任意前缀;
3)整个注释不区分大小写。
-
如果使用UTF-8,在Windows下最好保存的时候,选择无BOM方式。
-
在Windows的命令行中,要正确显示UTF-8输出,应该执行命令“chcp 65001”,并将字体改为“Lucida Console”。
-
JRuby 1.6.x默认情况下是和Ruby1.8兼容的,如果想要和1.9兼容,需要设置系统变量“JRUBY_OPTS=--1.9”。
-
通常情况下(除非调用了exit!方法),Ruby会在退出之前执行所有的END语句,以及任何用at_exit函数注册过的“关闭钩子”代码。