标签: pseudo-globals

在方法定义中使用$ 1,$ 2等全局变量

给出以下两段代码:

def hello(z)
  "hello".gsub(/(o)/, &z)
end
z = proc {|m| p $1}
hello(z)
# prints: nil
Run Code Online (Sandbox Code Playgroud)
def hello
  z = proc {|m| p $1}
  "hello".gsub(/(o)/, &z)
end
hello
# prints: "o"
Run Code Online (Sandbox Code Playgroud)

为什么这两段代码的输出不同?有没有一种方法,以块传递到gsub从方法定义之外,这样的变量$1,$2将被以同样的方式,就好像块的方法定义中给出的评价?

ruby scope pseudo-globals

8
推荐指数
1
解决办法
1004
查看次数

为什么只有有限数量的正则表达式捕获存储在`global_variables`中?

如果我匹配带有十个捕获的正则表达式:

/(o)(t)(th)(f)(fi)(s)(se)(e)(n)(t)/.match("otthffisseent")
Run Code Online (Sandbox Code Playgroud)

然后,因为$10,我得到:

$10 # => "t"
Run Code Online (Sandbox Code Playgroud)

但它缺少了global_variables.我得到(在irb会话中):

[:$;, :$-F, :$@, :$!, :$SAFE, :$~, :$&, :$`, :$', :$+, :$=, :$KCODE, :$-K, :$,,
 :$/, :$-0, :$\, :$_, :$stdin, :$stdout, :$stderr, :$>, :$<, :$., :$FILENAME,
 :$-i, :$*, :$?, :$$, :$:, :$-I, :$LOAD_PATH, :$", :$LOADED_FEATURES,
 :$VERBOSE, :$-v, :$-w, :$-W, :$DEBUG, :$-d, :$0, :$PROGRAM_NAME, :$-p, :$-l,
 :$-a, :$binding, :$1, :$2, :$3, :$4, :$5, :$6, :$7, :$8, :$9]
Run Code Online (Sandbox Code Playgroud)

这里只列出前九个:

$1, :$2, :$3, :$4, :$5, :$6, :$7, :$8, :$9
Run Code Online (Sandbox Code Playgroud)

这也得到以下证实:

global_variables.include?(:$10) # …
Run Code Online (Sandbox Code Playgroud)

ruby regex pseudo-globals

8
推荐指数
2
解决办法
326
查看次数

为什么Ruby全局字符串,比如$&,忽略了没有错误的突变?

我正在学习Ruby(2.0),这让我感到惊讶:

s = "1234"
s =~ /\d+/
$&  ==> "1234"       # as expected, $& contains the matched string
$&.slice!(-2..-1)    # should mutate string
$&  ==> "1234"       # what?
s.slice(-2..-1) 
s  ==> "12"          # as expected
Run Code Online (Sandbox Code Playgroud)

slice!方法应该改变字符串.其他mutator方法的行为方式相同.我的问题:为什么这不会引发错误,这是我所期望的,当一个函数无法完成它所说的那样的事情时?这是在某处记录的吗?有理由吗?

更新

所以,我认为这$&不是一个全局变量.每次引用都会给出一个新对象,就好像它实际上是一个无参数函数:

irb> $foo = "1234"
=> "1234"
irb> $foo.object_id
=> 70205012205980
irb> $foo.object_id
=> 70205012205980   # the same
irb> $&.object_id
=> 70205003531300
irb> $&.object_id   
=> 70205011619040   # different object
Run Code Online (Sandbox Code Playgroud)

所以......我的问题变成了:这只是解释器中的"魔术",或者$&实际上是一个无法使用的函数,正如我在Ruby中定义的那样def ... end?而且,我怎么能分辨出来呢?在Python中,我可以foo通过使用它的名称来引用一个函数:

>>> …
Run Code Online (Sandbox Code Playgroud)

ruby pseudo-globals

6
推荐指数
1
解决办法
216
查看次数

如何覆盖`File::SEPARATOR`

文件File.join说明:

join(string, ...) ? string

返回通过使用连接字符串形成的新字符串File::SEPARATOR

File.join("usr", "mail", "gumby") #=> "usr/mail/gumby"

但是,下面的结果显示了不同的行为。

File::SEPARATOR #=> "/"
File::SEPARATOR = "doge"
File::SEPARATOR #=> "doge"
File.join("so", "wow") #=> "so/wow"
Run Code Online (Sandbox Code Playgroud)

有人能解释一下发生了什么吗?有没有办法通过设置File::SEPARATOR为另一个值来覆盖此行为?

我没有具体的用例,也没有寻找解决方法..只是好奇。先感谢您。

ruby separator pseudo-globals

6
推荐指数
1
解决办法
728
查看次数

标签 统计

pseudo-globals ×4

ruby ×4

regex ×1

scope ×1

separator ×1