Что такое пронумерованные глобальные переменные Ruby
Что значения $1, $2, $', $`означают в Ruby?
2 ответа
Они представляют собой результаты самого последнего сопоставления с образцом (как и в Perl; Ruby изначально снял много синтаксиса с Perl, хотя к настоящему времени он в значительной степени преодолен:)). $1
, $2
и т. д. относятся к заключенным в скобки захватам в регулярном выражении: дано /a(.)b(.)c/
, $1
будет персонаж между a
а также b
а также $2
символ между b
а также c
, $`
а также $'
означают строки до и после строки, которая соответствует всему регулярному выражению (которое само по себе в $&
) соответственно.
На самом деле в этом есть какой-то смысл, хотя бы исторически; Вы можете найти это в perldoc perlvar
, который обычно хорошо документирует предполагаемую мнемонику и историю переменных Perl, и в основном все еще применяется к глобальным переменным в Ruby. Пронумерованные захваты являются заменой синтаксиса регулярных выражений обратного захвата (\1
, \2
, так далее.); Perl переключился с первого на второе где-то в версиях 3.x, потому что использование синтаксиса обратных ссылок вне регулярного выражения слишком усложняло синтаксический анализ. (К тому времени, когда Perl 5 развернулся, парсер был достаточно переписан, чтобы синтаксис снова был доступен, и быстро использовался для ссылок /"указателей". Ruby выбрал использование кавычек :
вместо этого, что ближе к стилю Lisp и Smalltalk; с тех пор как Ruby начинал как Perl-подобный с ОО в стиле Smalltalk, это стало более понятным с лингвистической точки зрения.) То же самое относится и к $&
, который в историческом синтаксисе регулярных выражений просто &
(но вы не можете использовать это вне замещающей части замещения, поэтому она стала переменной $&
вместо). $`
а также $'
оба являются "cutesy": "обратная кавычка" и "прямая кавычка" из соответствующей строки.
Номера для нумерации перечислены здесь:
http://www.zenspider.com/Languages/Ruby/QuickRef.html
$1, $2 ... $N
ссылаются на совпадения в группе захвата регулярных выражений.
Так:
"ab:cd" =~ /([a-z]+):([a-z]+)/
Даст
$1 = "ab"
$2 = "cd"