Что такое пронумерованные глобальные переменные Ruby - PullRequest
9 голосов
/ 13 июля 2011

Что означают значения $ 1, $ 2, $ ', $ `в Ruby?

Ответы [ 2 ]

18 голосов
/ 13 июля 2011

Это снимки с самого последнего совпадения с образцом (так же, как в 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, это более логично с точки зрения лингвистики.) То же самое относится к $&, который в историческом синтаксисе регулярных выражений просто & (но вы можете 't использовать его вне замещающей части замещения, чтобы вместо этого она стала переменной $&).$` и $' оба являются "cutesy": "обратная кавычка" и "прямая кавычка" из соответствующей строки.

7 голосов
/ 13 июля 2011

Здесь перечислены ненумерованные номера:

http://www.zenspider.com/Languages/Ruby/QuickRef.html#19

$1, $2 ... $N относится к совпадениям в группе сбора регулярных выражений.

Итак:

"ab:cd" =~ /([a-z]+):([a-z]+)/

даст

$1 = "ab"
$2 = "cd"
...