目录搜索
Ruby用户指南3、开始4、简单的例子5、字符串6、正则表达式7、数组8、回到那些简单的例子9、流程控制10、迭代器11、面向对象思维12、方法13、类14、继承15、重载方法16、访问控制17、单态方法18、模块19、过程对象20、变量21、全局变量22、实变量23、局部变量24、类常量25、异常处理:rescue26、异常处理:ensure27、存取器28、对象的初始化29、杂项RGSS入门教程1、什么是RGSS2、开始:最简单的脚本3、数据类型:数字4、数据类型:常量与变量5、数据类型:字符串6、控制语句:条件分歧语句7、控制语句:循环8、函数9、对象与类10、显示图片11、数组12、哈希表(关联数组)13、类14、数据库15、游戏对象16、精灵的管理17、窗口的管理18、活动指令19、场景类Programming Ruby的翻译Programming Ruby: The Pragmatic Programmer's Guide前言RoadmapRuby.new类,对象和变量容器Containers,块Blocks和迭代Iterators标准类型深入方法表达式Expressions异常,捕捉和抛出(已经开始,by jellen)模块基本输入输出线程和进程当遭遇挫折Ruby和它的世界Ruby和Web开发Ruby TkRuby 和微软的 Windows扩展RubyRuby语言 (by jellen)类和对象 (by jellen)Ruby安全反射Reflection内建类和方法标准库OO设计网络和Web库Windows支持内嵌文档交互式Ruby Shell支持Ruby参考手册Ruby首页卷首语Ruby的启动环境变量对象执行结束时的相关处理线程安全模型正则表达式字句构造程序变量和常数字面值操作符表达式控制结构方法调用类/方法的定义内部函数内部变量内部常数内部类/模块/异常类附加库Ruby变更记录ruby 1.6 特性ruby 1.7 特性Ruby术语集Ruby的运行平台pack模板字符串sprintf格式Marshal格式Ruby FAQRuby的陷阱
文字

内部变量

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

全局变量

所有以`$'开头的变量

内部变量

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

特殊变量

内部变量中,形如"`$' + 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

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


上一篇:下一篇: