Ruby 编程/语法/变量和常量
Ruby 中的变量可以通过其名称开头的字符来区分。变量名称的长度没有限制(堆大小除外)。
第一个字符指示作用域
- 局部变量 - 小写字母或下划线
- 实例变量 - @
- 在类作用域中,实例变量属于作为类的对象
- 要在属于类的对象上定义实例变量,请在 initialize() 中使用 @
- 类变量 - @@
- 全局变量 - $
- 常量 - 大写字母
有关与类相关的变量作用域的更多信息,请参阅 Ruby 编程/语法/类。
示例
foobar _foobar
名称以小写字母 (a-z) 或下划线 (_) 开头的变量是局部变量或方法调用。
局部变量只能在其初始化块内访问。例如
i0 = 1 loop { i1 = 2 puts defined?(i0) # true; "i0" was initialized in the ascendant block puts defined?(i1) # true; "i1" was initialized in this block break } puts defined?(i0) # true; "i0 was initialized in this block puts defined?(i1) # false; "i1" was initialized in the loop
示例
@foobar
名称以 '@' 开头的变量是self的实例变量。实例变量属于 对象 本身。未初始化的实例变量的值为nil.
类变量由类的所有实例共享,并以 '@@' 开头。示例
@@foobar
需要注意的是,类变量由类的所有后代共享。示例
class Parent
@@foo = "Parent"
end
class Thing1 < Parent
@@foo = "Thing1"
end
class Thing2 < Parent
@@foo = "Thing2"
end
>>Parent.class_eval("@@foo")
=>"Thing2"
>>Thing1.class_eval("@@foo")
=>"Thing2"
>>Thing2.class_eval("@@foo")
=>"Thing2"
>>Thing2.class_variables
=>[]
Parent.class_variables
=>[:@@foo]
这向我们表明,我们所有的类都在更改相同的变量。类变量的行为类似于全局变量,这些全局变量仅在继承树中可见。因为 Ruby 首先通过查找继承树来解析变量,所以如果两个子类都添加了同名的类变量,则可能会导致问题。
示例
$foobar
名称以 '$' 具有全局作用域;这意味着在运行时,可以在程序中的任何位置访问它。
用法
FOOBAR
名称以大写字母 (A-Z) 开头的变量是常量。常量可以在初始化后重新分配一个值,但这样做会生成警告。每个 类 都是一个常量。
尝试访问未初始化的常量会引发 NameError 异常。
常量的查找基于您的作用域或范围解析运算符(即 '::')。例如
class A A2 = 'a2' class B def go A2 end end end instance_of_b = A::B.new a2 = A::A2
另一个示例
class Foo BAR = 123 end puts Foo::BAR # => 123
self
- 当前方法的执行上下文,它可以引用实例、类或模块。
nil
NilClass
类的唯一实例。表示空值。
true
TrueClass
类的唯一实例。表示真。
false
FalseClass
类的唯一实例。表示假。
$1, $2 ... $9
- 这些是正则表达式匹配的捕获组的内容。它们是当前线程和堆栈帧的本地内容!
(在 Ruby 中,nil 也被视为false,其他所有值都被视为true。)伪变量的值不能更改。对伪变量进行替换会导致引发异常。
在处理正则表达式或 Ruby 解释器参数时,许多预定义变量很有用。
名称 | 别名 | 描述 |
---|---|---|
$! |
$ERROR_INFO [1] |
由最后一个 'raise'(最后抛出的异常)设置的异常信息消息。 |
$@ |
$ERROR_POSITION [1] |
最后抛出的异常的反向跟踪数组。 |
$& |
$MATCH [1] |
在此作用域中,最后一个成功模式匹配匹配的字符串。 |
$` |
$PREMATCH [1] |
最后一个成功匹配左侧的字符串。 |
$' |
$POSTMATCH [1] |
最后一个成功匹配右侧的字符串。 |
$+ |
$LAST_PAREN_MATCH [1] |
最后一个成功匹配的最后一个组。 |
$1 到 $9 |
最后一个成功正则表达式匹配的第 N 个组。 | |
$~ |
$LAST_MATCH_INFO [1] |
有关当前作用域中最后一次匹配的信息。 |
$= |
$IGNORECASE [1] |
不区分大小写的标志,默认值为 nil(已弃用)。 |
$/ |
$INPUT_RECORD_SEPARATOR [1],$RS [1] 或 $-0 |
输入记录分隔符,默认为换行符。 |
$\ |
$OUTPUT_RECORD_SEPARATOR [1] 或 $ORS [1] |
print 和 IO#write 的输出记录分隔符。默认为 nil。 |
$, |
$OUTPUT_FIELD_SEPARATOR [1] 或 $OFS [1] |
print 和 Array#join 的输出字段分隔符。 |
$; |
$FIELD_SEPARATOR [1],$FS [1] 或 $-F |
String#split 的默认分隔符。 |
$. |
$INPUT_LINE_NUMBER [1] 或 $NR [1] |
最后读取的文件的当前输入行号。 |
$< |
$DEFAULT_INPUT [1] |
一个对象,提供对作为命令行参数给出的所有文件内容的连接的访问,或 $stdin(在没有参数的情况下)。只读。 |
$FILENAME |
|
来自 $< 的当前输入文件。与 $<.filename 相同。 |
$> |
$DEFAULT_OUTPUT [1] |
Kernel.print 和 Kernel.printf 的输出目标。默认值为 $stdout。 |
$_ |
$LAST_READ_LINE [1] |
gets 或 readline 的最后一个输入字符串行。 |
$0 |
|
包含正在执行的脚本的名称。可能是可分配的。 |
$* |
ARGV [1] |
为脚本提供的命令行参数。也称为 ARGV |
$$ |
$PROCESS_ID [1]、$PID [1] 或 Process.pid |
运行此脚本的 Ruby 进程号。 |
$? |
$CHILD_STATUS [1] |
最后一个执行的子进程的状态。 |
$: |
$LOAD_PATH |
通过 load 或 require 加载脚本和二进制模块的加载路径。 |
$" |
$LOADED_FEATURES 或 $-I |
包含由 require 加载的模块名称的数组。 |
$stderr |
|
当前的标准错误输出。 |
$stdin |
|
当前的标准输入。 |
$stdout |
|
当前的标准输出。 |
$-d |
$DEBUG |
-d 开关的状态。可赋值。 |
$-K |
$KCODE |
源代码的字符编码。 |
$-v |
$VERBOSE |
由 -v 开关设置的详细模式标志。 |
$-a |
|
如果设置了 -a 选项(“自动分割”模式),则为真。只读变量。 |
$-i |
|
如果设置了就地编辑模式,则此变量保存扩展名,否则为 nil。 |
$-l |
|
如果设置了 -l 选项(“行尾处理”已开启),则为真。只读变量。 |
$-p |
|
如果设置了 -p 选项(“循环”模式已开启),则为真。只读变量。 |
$-w |
|
如果设置了 -w 选项,则为真。 |
为了避免批评使用两个字符、基于标点的变量名过于模糊或令人困惑,标准库的一部分是“English
”,它定义了上面表格中列出的较长名称。要包含这些名称,只需按如下方式引入 English 库即可。[1]
无 ‘English’
$\ = ' -- ' "waterbuffalo" =~ /buff/ print $", $', $$, "\n"
有 English
require "English" $OUTPUT_FIELD_SEPARATOR = ' -- ' "waterbuffalo" =~ /buff/ print $LOADED_FEATURES, $POSTMATCH, $PID, "\n"
请注意,在解析时也有一些预定义的常量,即
__FILE__ (current file) __LINE__ (current line)
和
__dir__ (current directory) __method__ (current method)
(Ruby 2.0 中新增)
可以在 Ruby 语言文档中找到预定义全局常量的列表。[2] 其中值得注意的是
全局常量名称 | 描述 |
---|---|
STDIN
|
标准输入。$stdin 的默认值。 |
STDOUT
|
标准输出。$stdout 的默认值。 |
STDERR
|
标准错误输出。$stderr 的默认值。 |
ENV
|
包含当前环境变量的哈希表。 |
ARGV
|
脚本给定的命令行参数的数组。 |
RUBY_VERSION
|
Ruby 语言版本,例如,ruby -e 'puts RUBY_VERSION' 将打印 2.7.0 。 |
RUBY_RELEASE_DATE
|
发布日期字符串,例如,2019-12-25 。 |
RUBY_PLATFORM
|
平台标识符,例如,x86_64-linux-gnu |
RUBY_PATCHLEVEL
|
此 Ruby 的补丁级别,例如,0 。如果这是 Ruby 的开发版本,则补丁级别将为 -1 。 |