$ 1 и \ 1 в рубине - PullRequest
       42

$ 1 и \ 1 в рубине

48 голосов
/ 14 ноября 2008

При использовании регулярных выражений в Ruby, в чем разница между $ 1 и \ 1?

Ответы [ 2 ]

81 голосов
/ 14 ноября 2008

\ 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
29 голосов
/ 14 ноября 2008

Имейте в виду, что есть третий вариант, блочная форма 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...