给出以下两段代码:
def hello(z)
  "hello".gsub(/(o)/, &z)
end
z = proc {|m| p $1}
hello(z)
# prints: nil
def hello
  z = proc {|m| p $1}
  "hello".gsub(/(o)/, &z)
end
hello
# prints: "o"
为什么这两段代码的输出不同?有没有一种方法,以块传递到gsub从方法定义之外,这样的变量$1,$2将被以同样的方式,就好像块的方法定义中给出的评价?
如果我匹配带有十个捕获的正则表达式:
/(o)(t)(th)(f)(fi)(s)(se)(e)(n)(t)/.match("otthffisseent")
然后,因为$10,我得到:
$10 # => "t"
但它缺少了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]
这里只列出前九个:
$1, :$2, :$3, :$4, :$5, :$6, :$7, :$8, :$9
这也得到以下证实:
global_variables.include?(:$10) # …我正在学习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
该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
所以......我的问题变成了:这只是解释器中的"魔术",或者$&实际上是一个无法使用的函数,正如我在Ruby中定义的那样def ... end?而且,我怎么能分辨出来呢?在Python中,我可以foo通过使用它的名称来引用一个函数:
>>> …文件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"
有人能解释一下发生了什么吗?有没有办法通过设置File::SEPARATOR为另一个值来覆盖此行为?
我没有具体的用例,也没有寻找解决方法..只是好奇。先感谢您。