Что означает модификатор 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

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