跳转到内容

Ruby 编程/语法/变量和常量

来自 Wikibooks,开放世界中的开放书籍

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
  1. a b c d e f g h i j k l m n o p q r s t u v w x y z English.rb 来自 Ruby 1.9.2 标准库文档
  2. 来自官方 Ruby 文档的关于预定义全局变量和常量 的文档
上一页:词法学 索引 下一页:字面量
华夏公益教科书