预定义变量

下面变量是Ruby解释器内预定义的。在下面这些描述中,符号[r/o]表明此变量是只读的,如果程序试图修改只读变量会引发一个错误。毕竟,你或许不想在程序的中途修改true的含意(除非你是个政客)。符号[thread]是线程局部变量。


很多全局变量看起来像个咒语:$_$!$&,等等。这是历史上的原因,大多数这些变量的名字来自于Perl。如果你发现记住所有这些标点符号很困难的话,你可以查看650页的叫English的库,它给出全局变量名字的描述。

下面的变量和常量表格中,我们显示变量的名字,引用对象的类型,和一个描述。

 

异常信息

1$! Exception 传递给raise的异常对象 [thread]

2$@ Array 以数组形式保存最后的异常的back trace信息。见497页的 Kernel#caller [thread]

模式匹配变量

这些变量(除了$=)在匹配不成功时被设置为nil

1$& String 被匹配的字符串(在成功地匹配之后)。这个变量的当前作用域是本地的。 [r/o, thread]

2$+ String 匹配成功后,最大编号组的内容。即,在 "cat" =~/(c|a)(t|z)/ 中, 3$+ 将被设置为“t”。这个变量的当前作用域是本地的。 [r/o, thread]

4$` String 成功匹配之后字符串的前面的字符串。这个变量的当前作用域是本地的。 [r/o, thread]

5$' String 匹配成功之后的字符串后面的字符串。这个变量的当前作用域是本地的。 [r/o, thread]

6$= Object 声明不赞成的。 如果值被设成nilfalse,所有匹配将是大小写敏感的,字符串的比较将忽略大小写,字符串哈希表值将是大小写敏感的。

7$1 to $9 String 成功匹配后,匹配成功的组的内容。在 "cat" =~/(c|a)(t|z)/ 中,$1 将被设成“a” ,而 $2 被设成 “t” 这个变量的当前作用域是本地的。 [r/o, thread]

8$~ MatchData 一个包装成功匹配结果的对象。变量 $&, $`, $', $1 to $9 的值来源于$~。赋值给$~会修改这些衍生变量的值。这个变量的当前作用域是本地的。 [thread]

 

输入/输出变量

1$/ String 输入记录分隔符(缺省是换行符n)。例程如Kernel#gets使用这个值来确定记录边界。如果它被设为nilgets将读入整个文件。

2$-0 String 用于$/ 的符号。

3$ String 输出记录分隔符。出现在每个调用方法如Kernel#printIO#write的输出中的字符串。缺省值是nil

4$, String 方法的各个参数之间如Kernel#printArray#join输出的字符串分隔符。缺省值为nil,它不添加给文本。

5$. Fixnum 最后读入的当前输入文件的行号。

6$; String 用于String#split的缺省分隔符模式。可以在命令行上使用-F标志来设置。

7$< Object 提供做为命令行参数或$stdin(在这种情况下,没有参数)的给定文件的内容的串联访问的对象。$< 支持类似于File对象的方法:binmode, close, closed?, each, each_byte, each_line, eof, eof?, file, filename, fileno, getc, gets, lineno, lineno=, path, pos, pos=, read, readchar, readline, readlines, rewind, seek, skip, tell, to_a, to_i, to_io, to_s, 还有Enumerable模块内的方法。方法file为当前在读取的文件返回一个File对象。This may change as $< reads through the files on the command line. [r/o]

8$> IO Kernel#printKernel#printf的输出目的地。缺省值是$stdout

9$_ String Kernel#getsKernel#readling读入的最后行。Kernel模块内的很多与字符串相关的方法都缺省地在$_上进行操作。变量的当前作用域是本地。 [thread]

10$defout IO $> 的同义词。过时的:应使用$stdout

11$deferr IO STDERR.的同义词。过时的:应使用$stderr

12$-F String $; 的别名。

13$stderr IO 当前的标准错误输出。

14$stdin IO 当前的标准输入。

15$stdout IO 当前的标准输出。给$stdout赋值是过时:应使用$stdout.reopen来代替。

 

运行中的环境变量

1$0 String 运行中的顶层Ruby程序的名字。典型地这将是程序的文件名。在有些操作系统上,给这个变量赋值将修改ps(1)命令的输出方式。

2$* Array 来自程序启动的包含命令行选项的字符串数组。由Ruby解释器使用的选项将被移除。 [r/o]

3$" Array 包含以require加载的模块的文件名。 [r/o]

4$$ Fixnum 当前运行程序的进程号码。 [r/o]

5$? Process::Status 本线程中最后结束的子进程的状态值。 [r/o, thread]

6$: Array 一个字符串数组,这儿的每个字符串都指定了一个用于,使用了loadrequire方法的Ruby脚本和二进制扩展的搜索目录。 通过-I命令行选项传递的参数值是初始值,环境变量RUBYLIB的值,还有当前目录 (“.”)。这个变量可以程序内设置它来修改缺省的搜索路径;典型地程序使用$: << dir 来附加目录给路径。 [r/o]

7$-a Object 如果在命令行上指定了 –a 选项则为true [r/o]

8$-d Object $DEBUG 的别名。

9$DEBUG Object 如果在命令行指定了 –d 选择则它为true

10__FILE__ String 当前源文件的名字。 [r/o]

11$F Array 如果命令行使用了-a选项,则它是被调的分离输入行的数组。

12$FILENAME String 当前输入文件的名称。等价于$<.filename [r/o]

13$-i String 如果编辑模式为可用(或许在命令行上使用了-i选项) 14$-i 持有创建文件时的扩展名。如果你给$-i设置值,就可打开编辑模式。参见168页。

15$-I Array $: 的别名。 [r/o]

16$-K String 为字符串和正则表达式设置多字节编码。等价于命令行参数-K。参见169页。

17$-l Object 如果在命令行上使用了-1选项,则它为true [r/o]

18__LINE__ String 源文件的当前行号。 [r/o]

19$LOAD_PATH Array $:的别名。 [r/o]

20$-p Object 如果在命令行上使用-p选项,则它为true

21$SAFE Fixnum 当前安全等级(参见380)。这个变量的值不可通过赋值来减小。 [thread]

22$VERBOSE Object 如果在命令行上指定了-v,-version,-W-w选项则它为true。如果没有指定选项或指定了-W1,则它为false。如果指定了W0,则它为nil。设置这个选项为true,可使解释器和一些库例程报告额外的信息。设置为nil则抑止所有的警告(包括Kernel.warn的输出)

23$-v Object $VERBOSE 的别名。

24$-w Object $VERBOSE 的别名。

 

标准对象

1ARGF Object $<的别名。

2ARGV Array $* 的别名。

3ENV Object 包含程序环境变量一个伪哈希表。是类Object的一个实例,ENV实例了所有的Hash方法。用于查询和设置一个环境变量,如ENV["PATH"] ENV["term"]="ansi"

4false FalseClass FalseClass的单态实例。 [r/o]

5nil NilClass NilClass的单态实例。未初始化实例和全局变量的值。 [r/o]

6self Object 当前方法的被调(对象) [r/o]

7true TrueClass TrueClas的单态实例。 [r/o]

 

全局常量

下面是由Ruby解释器定义的常量。

1DATA IO 如果主程序文件包含指示符__END__, 那么常量DATA将被初始化,以便读入__END__以后的行。

2FALSE FalseClass false 的别名。

3NIL NilClass nil的别名。

4RUBY_PLATFORM String 显示程序运行平台的指示符。This string is in the same form as the platform identifier used by the GNU configure utility (which is not a coincidence).

5RUBY_RELEASE_DATE String Ruby发布的日期。

6RUBY_VERSION String 解释器的版本号码。

7STDERR IO 程序实际上的标准错误流。$stderr的初始化值。

8STDIN IO 程序实际上的标准输入流。$stdin的初始化值。

9STDOUT IO 程序实际上的标准输出流。$stdout的初始化值。

10SCRIPT_LINES__ Hash 如果常量 SCRIPT_LINES__ 被定义并引用了一个哈希表,Ruby将存储它解析的每个文件的内容条目,用文件名做为键,用字符串数组做为值。参见507页的Kernel.require中的例子。

11TOPLEVEL_BINDING Binding 绑定在Ruby顶层的Binding对象。

12TRUE TrueClass true 的别名。

常量__FILE__和变量$0通常被用在一起,如果它出现在由用户直接运行的文件内,它们将被运行。例如,库的作者通常使用这个来包括测试在它们的库中,如果库的源代码被直接地运行,则它们会被运行,但注意,如果源代码被请求到另一个程序内就不会是这样。

# library code

# ...

if __FILE__ == $0

# tests...

end

 

表达式

表达式内的单独术语可以下面任何一个。

字面值 Ruby字面值是数字,字符串,数组,哈希表,范围,符号,和正则表达式。这些都在304页中描述。

Shell 命令 shell 命令是围在反引号或通常的用%x开头的定界字符串(303)内的字符串。字符串的值是运行命令的标准输出。这个运行也用命令的退出状态设置$?变量的值。

filter = "*.c"

files = `ls #{filter}`

files = %x{ls #{filter}}

符号生成器 Symbol对象通过在一个操作符,字符串,变量,常量,方法,类,模块名字前前缀个冒号:来创建。Symbol对象对每个不同的名字将是唯一的,但是不引用到一个具体的名字的实例,所以对符号 :fred 来说是一样的,而不管上下文环境。一个符号类似于其它高级语言中的原子(atom)概念。

变量引用或常量引用 变量通过它的名字被引用。依赖于作用域(参考315),一个常量即可以用名字来引用也可以查询它名字,只要类或模块的名字使用包含有常量和作用域(::)

barney # 变量引用。

APP_NAMR # 常量引用

Math::PI # 查询常量引用

方法启动 启动方法的各种方式在333页描述。

 

操作符表达式

表达式可以与操作符结合。表22.4按优先级次序列出了Ruby的操作符。方法一档若被标记,则说明它是个方法或者说它可被重写。

More on Assignment

赋值操作指派一或多个右值(出现赋值操作符右侧的操作数)给一或多个左值(出现在赋值操作符左边的操作数)。这意味着通过赋值可初始化每个左值。

如果左值是个变量或常量名字,那么变量或常量接受相应右值的一个引用。

a = /regexp/

b, c, d = 1, "cat", [ 3, 4, 5 ]

如果左值是个对象属性,则相应的属性设置方法将会在被调内被调用,并传递右值做为参数。

obj = A.new

obj.value = "hello" # equivalent to obj.value=("hello")

如果左值是个数组元素引用,Ruby调用被调内的元素的赋值操作符([ ]=),传递出现方括号内右值做为参数。这个说明在下面表格中。

赋值表达式的值是它的右值。即使对于一个返回有些不同属性方法也是一样的。

 

并列赋值

赋值表达式可以一个或多个左值及右值。本节解释Ruby如何管理不同参数的赋值。

1. 如果最后的右值是带有星号前缀并且实现了to_ary方法,那么右值被数据内的元素替换,它的每个元素形成它的每一个右值。

2. 如果赋值包括多个左值和一个右值,右值会会被转换成一个数组,此数组再按上面(1)的描述被展开。

3. 连续的右值被赋值给左值。这个赋值在并列中很有效,所以(例如)a,b = b,a 将交换ab 的值。

4. 如果左值多于右值,多出的部分将被赋值为nil

5. 如果右值多于左值,多出的部分将被忽略。

6. 如果最后的左值带有星号前缀,这些规则会有些变动。这个左值在赋值期间将总是接受数组。数组将由通常赋值给这个左值的右值组成,后跟随其它右值(如果有的话)

7. 如果左值包含了有圆括号的列表,这个列表被视为嵌套的赋值语句,然后它按上面的规则用相应的右值进行赋值。

例子在85页。

 

块表达式

begin

body

end

表达式可以被beginend分组。块表达式的值是最后表达式被运行得出的值。

块表达式也扮演异常处理角色,这个描述345页。

 

布尔表达式

Ruby预定义了全局的falsenil。两者的值被视为是布尔上下文环境中的false。所有的其它值被视为true。当你明确地需要”true”值时,常量true是有效的。

And, Or, Not, and Defined?

and&&操作符计算它们第一个操作数的值。如果为false,则表达式返回第一个操作数的值;否则,表达式返回第二个操作数的值。

expr1 and expr2

expr1 && expr2

or||操作符计算它们第一个操作符。如果为true,则表达式返回第一个操作数的值;否则,表达式返回第二个操作数的值。

expr1 or expr2

expr1 || expr2

not!操作符计算它们的操作数,如果为true,则表达式返回false。如果为false则表达式返回true。由于历史原因,字符串,正则表达式,或范围不能做为单独的参数出现在not!中。

这些操作符的单词形式(and,ornot)比相应的符号形式(&& , | | !)有较低的优先级。可参考324页的表22.4有关细节。

defined?操作符返回nil,如果它参数,这个参数可是一个任意的表达式,没有被定义。否则,它返回那个参数一个描述。

出自:http://my4java.itpub.net/post/9983/64887