1$ и \1 в Ruby

49
задан Hamish Downer 25 November 2008 в 19:56
поделиться

2 ответа

\1 обратная ссылка, которая будет только работать в том же sub или gsub вызов метода, например:

"foobar".sub(/foo(.*)/, '\1\1') # => "barbar"

1$ является глобальной переменной, которая может использоваться в более позднем коде:

if "foobar" =~ /foo(.*)/ then 
  puts "The matching word was #{$1}"
end

Вывод:

"The matching word was bar"
# => nil
81
ответ дан Peter G. 7 November 2019 в 21:33
поделиться

Следует иметь в виду, что существует третья опция, клеточный вид sub. Иногда Вам нужен он. Скажите, что Вы хотите заменить некоторый текст реверсом того текста. Вы не можете использовать 1$, потому что он не связывается достаточно быстро:

"foobar".sub(/(.*)/, $1.reverse)  # WRONG: either uses a PREVIOUS value of $1, 
                                  # or gives an error if $1 is unbound

Вы также не можете использовать \1, потому что sub метод просто делает простую текстовую замену \1 с соответствующим полученным текстом, нет никакого волшебства, происходящего здесь:

"foobar".sub(/(.*)/, '\1'.reverse) # WRONG: returns '1\'

Поэтому, если Вы хотите сделать что-либо необычное, необходимо использовать клеточный вид sub (1$, 2$, $ ', $' и т.д. будет доступен):

"foobar".sub(/.*/){|m| m.reverse} # => returns 'raboof'
"foobar".sub(/(...)(...)/){$1.reverse + $2.reverse} # => returns 'oofrab'
29
ответ дан Brian Carper 7 November 2019 в 21:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: