内部变量

本参考手册使用下列术语.

全局变量

所有以`$'开头的变量

内部变量

全局变量中的内部变量(本网页介绍的变量)

特殊变量

内部变量中,形如"`$' + 1位数字或符号"的变量

选项变量

内部变量中,由命令行选项设定的变量,形如"`$-' +1个选项字符"

有时,内部变量(有特殊的功能和用途)的有效作用域不只限于全局,尽管如此,上述定义还是把它们划入到全局变量的范畴中(可以在任何地方使用内部变量,从这种意义上说它们是全局的,但它们的值并不只限于全局).

根据变量值的作用域的不同,大致将内部变量划分如下.

局部域

下列也可看做是线程内的局部变量.

$_

getsreadline最后读入的字符串.若遇到EOF则为nil.该变量的作用域是局部域.(记忆方法:与 Perl相同)

$&

在当前作用域中,正则表达式最后一次匹配成功的字符串.若最后一次匹配失败,则为nil.(记忆方法: 它和某些编辑器中的&是相同的)

等同于Regexp.last_match[0].

$~

在当前作用域中,最后一次匹配成功的相关信息(MatchData对象).若对其进行设定的话, 则$&以及$1 ... $9等的值也会发生变化.

可以使用$~[n]的形式从该数据中抽取第n个匹配结果($n).(记忆方法: ~ 是用来进行匹配的)

等同于Regexp.last_match.

$`

在当前作用域中,正则表达式最后一次匹配成功的字符串前面的字符串.若最后的匹配失败则为nil.(记忆方法: `被放在字符串前面)

等同于Regexp.last_match.pre_match.

$'

在当前作用域中,正则表达式最后一次匹配成功的字符串后面的字符串.若最后的匹配失败则为nil.(记忆方法: '被放在字符串后面)

等同于Regexp.last_match.post_match.

$+

在当前作用域中,正则表达式最后一次匹配成功的字符串部分中,与最后一个括号相对应的那部分字符串.若最后的匹配失败则为nil.在多项选择型匹配模型中,若您无法断定是哪个部分匹配成功时,该变量将会非常有用.(记忆方法: be positive and forward looking.)

$1
$2
$3 ...

分别存储着最后一次模型匹配成功时与第n个括号相匹配的值.若没有相应的括号时,其值为nil.(记忆方法: 类似于 \数字)

等同于Regexp.last_match[1], Regexp.last_match[2],...

线程局部域

下列变量在一个线程内部时是全局域变量,但在不同的线程之间是彼此独立的.

$?

本线程中最后结束的子进程的状态值. 1.6版本以前是整数,从1.7版本开始变为Process::Status对象.另外,请参考Process#wait等.

整数值就是使用wait()系统调用所获得的值,要想得到子进程的exit status的话,还得除以256($?/256). 1.7版本以后还可以使用Process::Status#exitstatus.

$!

最近发生的异常的信息.由raise设定.

$@

以数组形式保存着发生异常时的back trace信息. 数组元素是字符串,它显示了方法调用的位置,其形式为

"filename:line"

"filename:line:in `methodname'"

这和caller的返回值形式一致。

在向$@赋值时,$!不能为nil。调用$@的方法与$!.backtrace相同。而赋值方法与$!.set_backtrace相同。

(记忆方法:where exception occurred at.)

$SAFE

当前线程的安全等级。关于安全等级,请参考安全模型

Thread.current.safe_level相同。

全局域

$=

obsolete: 该变量将被废止。

说明在模式匹配或字符串比较中是否要区分大小写字母的标识。默认值为nil。

$/

输入记录分隔符。默认值为"\n"。其运作类似于awk的RS变量。

若将该变量设为 nil 时,将一次读入整个文件。若设为空字符串 "" 则将是段落模式,此时会把2个以上的连续的换行符当作记录切分符。

不能在$/中使用正则表达式。

(记忆方法: 在诗歌中使用 / 作为行的切分)

$\

输出记录分隔符。print会在最后输出该字符串。

默认值为nil,此时不会输出任何字符。

$,

默认的切分字符。若Array#join中省略了参数时或在print的各个参数间将会输出它。

默认值为 nil ,等同于空字符串。

$;

String#split中省略参数时的切分字符。默认值为nil,此时将进行特殊的分割。详情请参考String#split

ruby 1.8 feature:在1.6版本中只能把字符串赋值给$;。在1.8版本中则可以将任何对象代入其中,但考虑到String#split的变更问题,还是应该使用正则表达式。

同时,为了提供兼容性,最好不要依赖于 $; 。

$.

最后读入的输入文件的行号。

ARGF.lineno相同。若需要取得每个参数文件的行号时,需要使用ARGF.file.lineno

$<

由参数(若没的话就使用标准输入)构成的虚拟文件。也就是常数ARGF的别名。(记忆方法: <指定了shell的输入源)

$deferr ((<ruby 1.8 特性>)) ((<obsolete>))

Ruby解释器输出错误信息、警告信息和warn时的输出对象。

只能将内部带有write方法的对象赋值给该变量。(warn 等内部方法最终将调用$deferr.write方法)。

$deferr 是 $stderr 的别名。$deferr (尽管它刚出现不久) 将被废止。

$>
$defout ((<obsolete>))

内部函数printputsp等的默认输出对象。初始值为STDOUT。若指定了-i[extension]选项的话,则将使用与读取源同名的文件。(记忆方法: >指定了shell的输出对象)

只能将内部带有write方法的对象赋值给该变量(print等内部方法最终将调用write方法)。

若想改变print等Ruby内部函数的输出对象时,可以将该变量的值设定为别的IO即可。若想要改变子进程或C语言扩展库的标准输出时,则必须使用IO#reopen将标准输出重定向(redirect)到别的IO。请参考$stdout

ruby 1.8 特性:

$defout 是 $stdout 的别名。$defout 是obsolete

$0
$PROGRAM_NAME ((<ruby 1.8 特性>))

当前运行中的Ruby脚本名.根据OS的不同,有时向该变量赋值后,ps(1)的输出会发生变化.该功能适合于用来表示当前程序的状态.(记忆方法: 与sh 或 ksh 相同)

$*

传递给Ruby脚本的参数.内部常数ARGV的别名.Ruby自身用的参数已经被摘除.(记忆方法: 与sh 或 ksh 相同)

$$

当前运行中的Ruby进程的pid。(记忆方法: 与shell相同)

Process.pid相同.

$:
$LOAD_PATH

包含一个数组,其内容是loadrequire加载文件时用的搜索目录列表.(记忆方法: 冒号是环境变量PATH的切分符)

包含下列内容:启动时-I directory 选项所指定的目录,环境变量RUBYLIB的值,编译时指定的默认值还有"."(当前目录).下列就是典型的UNIX系统上的加载路径.

-I 指定的路径
环境变量 RUBYLIB 的值
/usr/local/lib/ruby/site_ruby/VERSION        site固有的,取决于VERSION的库
/usr/local/lib/ruby/site_ruby/VERSION/ARCH   site固有的,取决于系统的扩展库
/usr/local/lib/ruby/site_ruby                site固有的库
/usr/local/lib/ruby/VERSION                  标准库
/usr/local/lib/ruby/VERSION/ARCH             标准的,取决于系统的扩展库
.                                            当前目录

上表中的VERSION是表示Ruby版本的字符串,如"1.6"或"1.8"等.ARCH是表示硬件和OS的字符串,如"i686-linux"或"alpha-osf5.1"等.可以从Config::CONFIG['arch']中得到这些信息.

在多数UNIX系统中,编译时的默认路径是"/usr/local/lib/ruby".在mswin32,mingw32,cygwin,bccwin32,mswince这些环境中,是以ruby.dll所在位置为起点的相对路径.而在djgpp,emx(OS/2)中,则是以ruby.exe所在位置为起点的相对路径.

在使用-T 选项启动时,若将$SAFE设为1以上的值的话,则"." (当前目录)不会被纳入加载路径.

require 'foo'时,将交互搜索.rb和.so.

/usr/local/lib/ruby/site_ruby/VERSION/foo.rb
/usr/local/lib/ruby/site_ruby/VERSION/foo.so
/usr/local/lib/ruby/site_ruby/VERSION/ARCH/foo.rb
/usr/local/lib/ruby/site_ruby/VERSION/ARCH/foo.so
  :
  :

有的系统的共享库扩展名并非.so,此时将自动使用新的扩展名.例如在HP-UX上require 'foo.so'时将搜索foo.sl.因此在Ruby内部,可以一直使用.so.

若想用命令行查看加载路径的话,可以这样

$ ruby -e 'puts $:'

即可.

$"
$LOADED_FEATURES ((<ruby 1.8 特性>))

包含以require加载的文件名的数组.这可以防止require多次加载同一个文件.

$DEBUG

若此值为真则变成调试模式。它由-d选项进行设定。

调试模式与普通的运行有以下不同。

  • 若某线程因发生异常而结束时,整个解释器也将中止工作。这等同于将Thread.abort_on_exception设置为true的效果,但是在调试模式中,即使在脚本中使用 abort_on_exception= 类方法来重置标识也无法取消该效果。

    在通常的运行中,若某线程发生了异常却并没有被Thread#join等检测到的话,该线程将被无警告地终止。

  • 不管有没有捕捉到异常,只要它一旦发生就会被报告到 $stderr 。处理会继续进行。
$FILENAME

虚拟文件ARGF中,当前正在读入的(gets方法正在读的)文件名。与ARGF.filename相同。

$LOAD_PATH

$:的别名。

$stdin
$stdout
$stderr

标准输入,标准输出,标准错误输出。

ruby 1.8 特性

$stdout, $stderr 是 $defout,$deferr 的别名。($defout, $deferr 已经废止)

$stdout, $stderr的对应对象中必须要有名为write的方法。详细情况请参考defout,deferr

$stdin同$stdout、$stderr一样,即使没有特定的方法也可以对其赋值。若执行gets等方法时,该方法将被投射到$stdin对应的对象中。(将执行$stdin.gets)

$stdin所对应的对象中应该定义下列方法。(请根据需要取舍)

gets, readline, readlines, getc, readchar, tell, seek,
pos=, rewind, fileno, to_io, eof, each_line, each_byte,
binmode, closed?

例:

$stdin = Object.new
def $stdin.gets
  "foo"
end
p gets

# => "foo"

若想对标准输入、输出、错误输出等进行重定向(redirect)时,可以使用IO#reopen(1.6版也是如此)。例如

$stdout = File.open("/tmp/foo", "w")

写成这样

STDOUT.reopen("/tmp/foo", "w")

就可以了。若想取消重定向时

stdout_sv = STDOUT.dup          # 保存 STDOUT
STDOUT.reopen("/tmp/foo")       # 将 STDOUT 重定向到 /tmp/foo

puts "foo"                      # 输出到 /tmp/foo

STDOUT.flush                    # 必须(?)
STDOUT.reopen(stdout_sv)        # 恢复原状

就可以了。若您不想让重定向影响到子进程的话,只要向$stdout等赋值就足够了。

# 改变输出方法的默认输出对象
$stdout = File.open("/tmp/foo", "w")

puts "foo"

# 取回输出方法的默认输出对象。
$stdout = STDOUT

ruby 1.6 特性: 向$stdin、$stdout、$stderr赋值时,会进行重定向。

ruby 1.7 特性: 暂时修改了重定向的运作方式[ruby-dev:14601]

$VERBOSE

冗长消息标识。由面向Ruby解释器的-v选项进行设定。

ruby 1.8 特性

警告等级分为三级,分别如下。

  • nil: 不输出警告
  • false: 只输出重要警告(默认)
  • true: 输出所有警告

可以使用命令行选项-W[level]来指定警告等级,分别为-W0、-W1、-W2 (or -W)。指定-v-w时,等同于-W2。

若设定为nil、false之外的值时,其值为变为true。

$KCODE

Ruby可识别的多字节字符串的编码。变量值为"EUC" "SJIS" "UTF8" "NONE"之一。

当$KCODE的值为"EUC"时,将假定字符串或正则表达式的编码为EUC-JP。同样地,若为"SJIS"时则认定为Shift JIS。若为"UTF8"时则认定为UTF-8。若为"NONE"时,将不会识别多字节字符串。

在向该变量赋值时,只有第1个字节起作用,且不区分大小写字母。"e" "E" 代表 "EUC","s" "S" 代表 "SJIS","u" "U" 代表 "UTF8",而"n" "N" 则代表 "NONE"。

默认值为"NONE"。

[参考]

目前$KCODE将对Ruby的下列动作产生影响。

  • 解释器的字句解析器
  • Regexp的编码标识的默认值
  • (正则表达式字面值
  • Regexp.new)
  • upcase
  • downcase
  • swapcase
  • capitalize
  • inspect
  • split
  • gsub
  • scan

选项变量

用来显示Ruby解释器命令行信息的变量。其形式为$-?,?的部分是1位选项字符。

$-0

$/ 的别名。

$-a

若指定了-a时,其值为真。只读变量。

$-d

$DEBUG 的别名。

$-F

$; 的别名。

$-i

若指定了-i[extension]时,它将保存扩展名字符串。否则其值为nil。也可以在脚本中对其进行赋值,此时将在开始读入ARGV中的下一个文件之前进行in-place替换。

$-I

$LOAD_PATH 的别名。

$-K

$KCODE 的别名。

$-l

若指定了-l时,其值为真。只读变量。

$-p

若指定了-p时,其值为真。只读变量。

$-v
$-w

$VERBOSE 的别名。

$-W ((<ruby 1.9 特性>))

返回由-W[level]指定的值。

也就是说,根据$VERBOSE的取值不同

  • nil: 不输出警告 -> 0
  • false: 只输出重要警告(默认) -> 1
  • true: 输出所有警告 -> 2

而返回上述诸值之一。只读变量。