14

Ruby 正規表現にはいくつかのオプションがあります (例: ixm) oiたとえば、大文字と小文字を区別しないことを意味します。

oオプションの意味は?ではri Regexp、補間を 1 回だけo行うという意味です。#{}しかし、私がこれを行うとき:

a = 'one'  
b = /#{a}/  
a = 'two'  

b変わらない(そのまま/one/)。私は何が欠けていますか?

4

1 に答える 1

21

正規表現の頼りになるソースから直接:

/o#{...}特定の正規表現リテラルの置換が、最初に評価されるときに一度だけ実行されるようにします。そうしないと、リテラルが Regexp オブジェクトを生成するたびに置換が実行されます。

この使用例を上げることもできます:

# 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

したがって、これはむしろコンパイラー、複数回実行される一行のことだと思います。

于 2012-11-11T19:53:27.327 に答える