Имейте в виду, что есть третий вариант, блочная форма 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'