Что такое пронумерованные глобальные переменные 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"
Другие вопросы по тегам