知识点
相关文章
更多最近更新
更多Ruby常用的内部变量
2019-03-02 23:43|来源: 网路
在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> $~ => #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 ...
在当前作用域中,正则表达式最后一次匹配成功的字符串部分中,与最后一个括号相对应的那部分字符串,若最后的匹配失败则为nil。在多项选择型匹配模型中,若您无法断定是哪个部分匹配成功时,该变量将会非常有用。
irb(main):029:0> $+ => "bar"
线程局部域
下列变量在一个线程内部时是全局域变量,但在不同的线程之间是彼此独立的。
$!
最近发生的异常的信息,由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", "."]
全局常量
ENV
包含程序的环境变量,是一个Hash对象。
irb(main):006:0> ENV.each{|k,v| puts "#{k}=>#{v}"} ALLUSERSPROFILE=>C:\Documents and Settings\All Users APPDATA=>C:\Documents and Settings\xp2008\Application Data CLASSPATH=>.;C:\Program Files\Ringz Studio\Storm Codec\QTSystem\QTJava.zip CLIENTNAME=>Console CommonProgramFiles=>C:\Program Files\Common Files COMPUTERNAME=>HOOOPO ComSpec=>C:\WINDOWS\system32\cmd.exe FP_NO_HOST_CHECK=>NO HOME=>C:\Documents and Settings\xp2008 HOMEDRIVE=>C: #==============下略============ #==============下略============
DATA
读取__END__后程序行的输入流。如果__END__未出现在代码中则无定义。
STDERR,STDIN,STDOUT
标准输入、输出、错误流
RUBY_PLATFORM
ruby解释器平台
irb(main):008:0> RUBY_PLATFORM => "i386-mswin32"
ARGF同$* , ARGF同$<
转自:http://www.cnblogs.com/rubylouvre/archive/2009/07/23/1529237
相关问答
更多-
VB常用内部函数[2023-09-01]
Abs Array Asc Atn CallByName Choose Chr Command Cos CreateObject CurDir CVErr Date DateAdd DateDiff DatePart DateSerial DateValue Day DDB Dir DoEvents Environ EOF Error Exp FileAttr FileDateTime FileLen Filter Format FormatCurrency FormatDateTime FormatNum ... -
你想要的方法是rb_gv_get (它本身就是一些全局变量的包装)。 用rubyinline你可以写 require 'inline' class Foo inline :C do |builder| builder.c_raw_singleton <为什么我能够在LinkedList类之外创建Node对象,即使它被声明为私有? 因为ruby常量忽略“常规”可见性修饰符。 他们总是公开的,无论他们在哪个部分。要将它们private_constant私有,请使用private_constant 。 把这个不雅的设计称之为什么,但事实就是这样。 另外,请注意,即使使用private_constant ,私有性也意味着很少。 基本上,它所做的唯一的事情是从列表( LinkedList.constants )和直接解析( LinkedList::Node )中隐 ...一般来说,如果它不在ruby.h中,那么它不是一个“公共”api,寻找一个名为rb_xxx的方法也可能有所帮助。 GL。 in general if it's not in ruby.h, then it's not a "public" api looking for a method called rb_xxx might also help. GL.部分渲染发生在 click事件之前 。 事实上,在浏览器收到响应之前,局部呈现在服务器上。 您必须使用XHR来替换#my_destination_div的内容。 请参阅https://api.jquery.com/load/ .load( url [, data ] [, complete ] ) 说明:从服务器加载数据并将返回的HTML放入匹配的元素中。 此方法是从服务器获取数据的最简单方法。 https://api.jquery.com/load/ The rendering of the partia ...是的,它的确如此。 它适用于所有内置控制结构( while , if , begin ... end ),但不适用于块。 因此,如果您each或each重写代码,它的行为将与您的期望类似。 Yes, it really is how it works. It applies to all built-in control structures (while, for, if, begin ... end), but not to blocks. So if you rewrite your code usi ...该方法取决于您使用的是哪个Ruby函数API。 如果你使用的是当前的4.x API (你的函数在lib/puppet/functions/*.rb ),那么: if closure_scope['facts']['virtual'] == 'virtualbox' 文档: 在Ruby中编写函数:访问Puppet变量 或者,如果您使用旧版兼容3.x的API(您的函数位于lib/puppet/parser/functions/*.rb ),那么: if lookupvar('virtual') == 'vir ...在进入循环之前设置它,如: def select_player_symbol(player_1, player_2) player_1_symbol = nil player_2_symbol = nil loop do ... 这是有效的,因为通过建议的更改,player_1_symbol的范围是方法级别。 在它的范围在循环内部之前。 当你离开循环时,你失去了它。 set it before entering the loop like: def select ...
Ruby中的内部函数(Inner function in Ruby)[2023-05-03]
Ruby lambda类似于匿名js function : step1 = lambda {puts "I am a lambda!"} step1.call "optional args", ... 一些简写: f = -> {puts "Shorthand lambda"} f.() 更多信息(包括速记符号!!) 在这里 A Ruby lambda is similar to an anonymous js function: step1 = lambda {puts "I am a lambda! ...你可以在方法内部使用外部范围访问Ruby变量吗?(Can you access Ruby variables with outer scope inside of methods?)[2023-09-03]
这是Ruby访问嵌套函数中的外部变量的副本。 您可以通过调用@rotation将它作为包含对象的实例变量,但为什么不将string和rotation传递给encrypt方法呢? This is a duplicate of Ruby accessing outer variables in nested function. You could make it an instance variable on the containing object by calling it @rotation, but ...