Ruby regexp的o修饰符是什么意思?
Ruby regexp有一些选项(例如Ruby regexp的o修饰符是什么意思?,ruby,regex,Ruby,Regex,Ruby regexp有一些选项(例如i,x,m,o)i表示忽略大小写 o选项是什么意思?在ri Regexp中,它表示o意味着只执行一次{}插值。但当我这么做的时候: a = 'one' b = /#{a}/ a = 'two' b不变(它保持为/one/)。我错过了什么?直接来自: /o导致在特定正则表达式文本中的任何{…}替换在第一次计算时只执行一次。否则,每次文本生成Regexp对象时都将执行替换 我也可以出现: 因此,我想这对于编译器来说是一件非常重要的事情,因为一行执行
i
,x
,m
,o
)<例如,code>i表示忽略大小写
o
选项是什么意思?在ri Regexp
中,它表示o
意味着只执行一次{}
插值。但当我这么做的时候:
a = 'one'
b = /#{a}/
a = 'two'
b
不变(它保持为/one/
)。我错过了什么?直接来自:
/o
导致在特定正则表达式文本中的任何{…}
替换在第一次计算时只执行一次。否则,每次文本生成Regexp对象时都将执行替换
我也可以出现:
因此,我想这对于编译器来说是一件非常重要的事情,因为一行执行多次。您没有在regexp中使用
o
标志。你为什么期望它有任何效果呢?如果使用o
标志意味着打开效果,那么我认为regexp中的{}
可能每次都会执行,而不使用该标志。注意,在Perl(与Ruby相反)文档中,它声明了o
修饰符:“假装优化了代码,但实际上引入了bug”。因此,在Perl中,o
标志似乎与Ruby的含义不同,而且Perl标志可能会被打破。就在一秒钟前,我读了一篇关于评估策略
的wiki,我终于了解了很多。在ruby中,赋值做的是热切的求值,因此在段b=/{a}/
之后,b
被赋值到/one/
,也就是说,“o
标志没有任何关系”,这个答案被添加到了“修饰符”下的。
# avoid interpolating patterns like this if the pattern
# isn't going to change:
pattern = ARGV.shift
ARGF.each do |line|
print line if line =~ /#{pattern}/
end
# the above creates a new regex each iteration. Instead,
# use the /o modifier so the regex is compiled only once
pattern = ARGV.shift
ARGF.each do |line|
print line if line =~ /#{pattern}/o
end