为什么=〜运算符有时只会产生副作用?

Sta*_*erg 12 ruby regex irb pattern-matching oniguruma

我注意到Ruby/Oniguruma的副作用只出现在4个看似相同的陈述中的1个中.为什么变量day定义在009,但不在003,005007

irb(main):001:0> r = /(?<day>\d\d):(?<mon>\d\d)/
=> /(?<day>\d\d):(?<mon>\d\d)/

irb(main):002:0> r =~ "24:12"
=> 0
irb(main):003:0> day
NameError: undefined local variable or method `day' 

irb(main):004:0> "24:12" =~ r
=> 0
irb(main):005:0> day
NameError: undefined local variable or method `day'


irb(main):006:0> "24:12" =~ /(?<day>\d\d):(?<mon>\d\d)/
=> 0
irb(main):007:0> day
NameError: undefined local variable or method `day'


irb(main):008:0> /(?<day>\d\d):(?<mon>\d\d)/ =~ "24:12"
=> 0
irb(main):009:0> day
=> "24"
Run Code Online (Sandbox Code Playgroud)

nb#1:在所有四种情况下,它都是相同的正则表达式和相同的字符串.

nb#2:我已经验证了MS Windows和Ubuntu Linux中的行为.

Vas*_*ich 13

当你打电话给"24:12" =~ r你实际打电话"24:12".=~(r).因此,String#=〜只返回匹配开始的位置,如果没有匹配则返回nil.

但是当你打电话给/(?<day>\d\d):(?<mon>\d\d)/ =~ "24:12"你时,实际上叫Regexp#=〜

正如文件所说

如果=〜与带有命名捕获的正则表达式文字一起使用,则捕获的字符串(或nil)将分配给由捕获名称命名的局部变量.

怎么样003:

如果正则表达式不是文字,则不会发生分配.

   re = /(?<lhs>\w+)\s*=\s*(?<rhs>\w+)/
   re =~ "  x = y  "
   p lhs    # undefined local variable
   p rhs    # undefined local variable
Run Code Online (Sandbox Code Playgroud)

如果正则表达式位于右侧,则不会进行分配.
"x = y"= ~ /(?<lhs>\w+)\s*=\s*(?<rhs>\w+)/
p lhs,rhs #undefined局部变量

  • 我刚刚向ruby提交了关于doc(评论)中的错误的错误报告. (2认同)