在ruby程序中,经常会看到一些以$开头的变量,这些不是指我们自己在程序中设置的全局变量,而是指系统内部已经设置好的变量,他们代表了一些特定的意思,下面搜集了一些常用的内部变量,用一些简单的代码说明他们代表的意思:
局部域:
在某一个线程作用域内才能有效,下列也可看做是线程内的局部变量.
PS:这边讲解的几个变量都是于正则匹配相关的,正则匹配过程的代码是一样的,这里不重复输入正则表达式匹配的代码,只在第一个例子里给出完整的输入和输出,之后的例子只直接输出变量的值
$_
gets或readline最后读入的字符串.若遇到EOF则为nil.该变量的作用域是局部域.
irb(main):006:0> $_
=> nil
irb(main):007:0> gets
foobar
=> "foobar\n"
irb(main):008:0> $_
=> "foobar\n"
$&
在当前作用域中,正则表达式最后一次匹配成功的字符串.若最后一次匹配失败,则为nil.
irb(main):002:0> $&
=> nil
irb(main):010:0> /(foo)(bar)(BAZ)?/ =~ "foobarbaz"
=> 0
irb(main):011:0> $&
=> "foobar"
$~
在当前作用域中,最后一次匹配成功的相关信息(MatchData对象-为处理与正则表达式的匹配过程相关的信息而设置的类.).
可以使用$~[n]的形式从该数据中抽取第n个匹配结果($n).相当于是$1,$2...
等同于Regexp.last_match.
irb(main):012:0> $~
=> #<MatchData "foobar" 1:"foo" 2:"bar" 3:nil>
irb(main):026:0> $1
=> "foo"
irb(main):027:0> $~[1]
=> "foo"
$`
在当前作用域中,正则表达式最后一次匹配成功的字符串前面的字符串.若最后的匹配失败则为nil.
等同于Regexp.last_match.pre_match.
irb(main):016:0> $`
=> "" #由于最后匹配成功的内容是foobar,输入的字符串前面没有别的字符所以是""
$'
在当前作用域中,正则表达式最后一次匹配成功的字符串后面的字符串.若最后的匹配失败则为nil.
等同于Regexp.last_match.post_match.
irb(main):028:0> $'
=> "baz"
$+
在当前作用域中,正则表达式最后一次匹配成功的字符串部分中,与最后一个括号相对应的那部分字符串.若最后的匹配失败则为nil.在多项选择型匹配模型中,若您无法断定是哪个部分匹配成功时,该变量将会非常有用.
irb(main):029:0> $+
=> "bar"
$1
$2
$3 ...
分别存储着最后一次模型匹配成功时与第n个括号相匹配的值.若没有相应的括号时,其值为nil.等同于Regexp.last_match[1], Regexp.last_match[2],...
irb(main):030:0> $1
=> "foo"
irb(main):031:0> $2
=> "bar"
irb(main):032:0> $3
=> nil
线程局部域
下列变量在一个线程内部时是全局域变量,但在不同的线程之间是彼此独立的.
$!
最近发生的异常的信息.由raise设定.
def exception
begin
raise "exception test."
ensure
puts $!
end
end
exception
结果:
引用
simple.rb:58:in `exception': exception test. (RuntimeError)
from simple.rb:64
exception test. # $!中的值
$@
以数组形式保存着发生异常时的back trace信息. 数组元素是字符串,它显示了方法调用的位置,其形式为
"filename:line"
或
"filename:line:in `methodname'"
在向$@赋值时,$!不能为nil。
def exception
begin
raise "exception test."
ensure
puts $@
puts "$@ size is:#{$@.size}"
end
end
exception
结果:
引用
simple.rb:58:in `exception': exception test. (RuntimeError)
from simple.rb:65
simple.rb:58:in `exception' #$@中的值,是一个数组,第一个元素是错误发生的行数,第二个是异常的内容。下面打印了数组的长度
simple.rb:65
$@ size:2
全局域
这种类型的变量是整个应用中都可以访问的,而且是同一个变量的引用。是全局作用域的
$/
输入记录分隔符。默认值为"\n"。
irb(main):076:0> $/ #初始的输入分割符
=> "\n"
irb(main):077:0> gets
=> "\n"
irb(main):078:0> "test" #输入回车之后,默认插入"\n",输入结束
=> "test"
irb(main):079:0> $/="@" #修改输入符为"@"
=> "@"
irb(main):080:0> gets #输入回车之后没有结束读取进程,直到输入"@"之后结束
test
@
=> "test\n@"
$\
输出记录分隔符。print会在最后输出该字符串。
默认值为nil,此时不会输出任何字符。
irb(main):082:0> print "abc"
abc=> nil
irb(main):083:0> $\="@"
=> "@"
irb(main):084:0> print "abc"
abc@=> nil
$,
默认的切分字符。若Array#join中省略了参数时或在print的各个参数间将会输出它。
默认值为 nil ,等同于空字符串。
irb(main):087:0> ["a","b","c"].join
=> "abc"
irb(main):088:0> $,="," #修改切分字符为","
=> ","
irb(main):089:0> ["a","b","c"].join #输出结果改变
=> "a,b,c"
irb(main):090:0>
$;
当String#split中省略参数时的切分字符。默认值为nil,此时将进行特殊的分割。
irb(main):090:0> $;
=> nil
irb(main):091:0> "abc".split #默认的切分字符情况下,把整个字符当成一个元素
=> ["abc"]
irb(main):092:0> $;="b"
=> "b"
irb(main):093:0> "abc".split #以"b"为切分字符情况下,把整个字符当成两个元素
=> ["a", "c"]
$*
传递给Ruby脚本的参数.内部常数ARGV的别名
$$
当前运行中的Ruby进程的pid。
irb(main):094:0> $$
=> 5167
$:
$LOAD_PATH
包含一个数组,其内容是load或require加载文件时用的搜索目录列表.
irb(main):095:0> $:
=> ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", "."]
irb(main):096:0> $LOAD_PATH
=> ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", "."]
分享到:
- 2009-07-14 20:32
- 浏览 1681
- 评论(6)
- 论坛回复 / 浏览 (6 / 5182)
- 查看更多
相关推荐
内部变量 内部常数 内部类/模块/异常类 附加库 Ruby变更记录 ruby 1.6 特性 ruby 1.7 特性 ruby 1.8 特性 1.6.8到1.8.0的变更点(总结) ruby 1.9 特性 obsolete 对应DOSISH 附录 疑似BNF的Ruby语法 ...
Ruby 中充满了一系列的隐藏变量,我们可以从这些预定义的全局变量中获取一些有意思的信息。 全局进程变量 $$ 表示当前运行的 ruby 进程。 代码如下:>> $$=> 17170我们可以从当前进程杀死它自己 代码如下:>> `kill -9...
ruby还可以动态给对象实例添加一些属性或方法(javascript也是如此) 2.ruby中刻意弱化了变量类型这个概念,默认情况下变量/方法都不需要声明具体(返回)类型,但其实在ruby内部,会自动根据变量的值分配类型。...
Java和Kotlin的Ruby DoTunv项目的一个端口。从.env文件加载环境变量。
PHP变量的内部实现 编程语言的系统类型分为强类型和弱类型两种: 强类型语言是一旦某个变量被申明为某个类型的变量,在程序运行过程中,就不能将该变量的类型以外的值赋予给它,c/c++/java等语言就属于这类 php及ruby,...
Ruby中不具备嵌套作用域(即在内部作用域,可以看到外部作用域的)的特点,它的作用域是截然分开的,一旦进入一个新的作用域,原先的绑定会被替换为一组新的绑定。 程序会在三个地方关闭前一个作用域,同时打开一个新...
“Ruby外表简单,但内部却非常复杂,就像我们的人体一样。” — Yukihiro "Matz" Matsumoto 学习一门新语言 如果你要学习一门新的编程语言,你会问什么问题? 您已经学习了一种编程语言,并且您将要学习另一种! ...
:old_key: dotenv-java Ruby dotenv项目的无依赖性纯Java端口。 从.env文件加载环境变量。 dotenv-java还为流行的库提供了支持。 为什么要选择tentenv? 在环境中存储配置是应用程序的宗旨之一。 应该在部署环境之间...
Ruby之书 这是《Ruby 之书》一书中的源代码。 第 1 章:字符串、数字、类和对象 ... 其他书籍侧重于 Ruby 的时尚特性,而 The Book of Ruby揭示了世界上最流行的编程语言之一的秘密内部工作原理,
DSL块是真正的Ruby闭包,可以方便地利用外部变量并在内部和周围使用标准Ruby代码。 像往常一样用Ruby编码,并感到高兴! 没有意外的限制或对instance_exec / eval奇怪使用。 DSL语法仅限于在Glimmer模块中混合的类...
调试器允许在执行程序时了解Ruby程序内部发生的情况,并提供许多传统的调试功能,例如: 步骤:一次运行一行程序。 中断:在某个事件或指定的指令处暂停程序,以检查当前状态。 评估:基本的REPL功能,尽管在这...
Cesri是一个Ruby Gem,可让您使用内部税收服务的电子收据Web服务,以在厄瓜多尔进行电子发票。 此版本仅支持SRI的新“离线”模式。 安装 将此行添加到应用程序的Gemfile文件中: gem 'cesri' 然后运行: $ ...
我们用自己的“bin”的文件在内部通过使明瑟添加失效功能dependOn包含在各个文件.scss文件。源图支持Sourcemap 支持仍处于试验阶段。 在我们自己的本地测试中,我们发现@import ed 文件在直接访问/编译时经常失败,...
这些参数怎么定义,实际上是在函数内部定义好的,后面会讲到。 二,块内变量的访问 块内可以访问块外的变量,也就是块外的变量在块内是可见的,如 sum = 0 (1..5).each do |v| name = 'smile' #name属于块内...
技术支持变量,模板{{…}} 链接外部链接 [ … ] 内部链接,图像[[…]] 标记==标题== 列表(*#; :) 粗体( ''' ),斜体( '' )或两者( ''''' ) 水平尺(-)目录[ __NOTOC__, __FORCETOC__, __TOC__ ] ,,<pre> ...
第二个程序未运行,因为在方法外未定义变量'x',因此将x移入程序即可使程序运行。 数组1.变为[[“ b”,1],[“ b”,2],[“ b”,3],[“ a”,1],[“ a”,2],[“ a”, 3]] 数组2变为[1、2、3] 返回“示例...
您将在下面找到一些有关如何执行常见任务的信息。 您可以在找到本指南的最新版本。目录自动格式化代码更改页面<title> 安装依赖项导入组件代码分割添加样式表后处理CSS 添加CSS预处理器(Sass,Less等) 添加...
这个意思就是:private函数,只能在本对象内部访问到。 对象实例变量(@)的访问权限就是 private。 代码如下: class AccessTest def test return “test private” end def test_other(other) “other object ”+ ...