Что означает модификатор o для регулярного выражения?

В Ruby regexp есть несколько опций (например, i, x, m, o). i означает игнорировать регистр, например.

Что это o вариант значит? В ri Regexpэто говорит o значит выполнить #{} интерполяция только один раз. Но когда я делаю это:

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

b не меняется (остается /one/). Что мне не хватает?

1 ответ

Решение

Прямо из источника для регулярных выражений:

/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

Так что я думаю, что это скорее вещь для компилятора, для одной строки, которая выполняется несколько раз.

Другие вопросы по тегам