Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby regexp的o修饰符是什么意思?_Ruby_Regex - Fatal编程技术网

Ruby regexp的o修饰符是什么意思?

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对象时都将执行替换 我也可以出现: 因此,我想这对于编译器来说是一件非常重要的事情,因为一行执行

Ruby 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