我注意到Ruby/Oniguruma中的副作用只出现在4个看似等价的语句中的1个中。为什么变量day
定义在009
中,但不是在003
,005
或007
?= =操作符为什么只有时有副作用?
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"
nb#1:在所有四种情况下,这是相同的正则表达式和相同的字符串。
nb#2:我已经验证了MS Windows和Ubuntu Linux中的行为。
注意:虽然这不是这种情况,但在使用IRb中的局部变量时应该小心。由于在IRB中评估代码的方式,它们在IRB中的行为可能与脚本中的行为略有不同。总是写脚本来确认。 – 2011-05-25 15:25:59
好点,Jörg。 – 2011-05-25 16:26:11