$1
, $2
, $3
... являются наследием Perl.Это переменные группы захвата , то есть они захватывают группы внутри регулярного выражения.
Именованная группа указывается в скобках.Итак, первая группа захвата соответствует ([^\.])
, то есть любому не точечному символу, а (\..*)
соответствует точечному символу \.
и любым другим символам после него.
Обратите внимание, что вторая группа является необязательной, поэтому в строке ниже у вас есть троичное выражение $2 ? $2 : ""
, которое является загадочным способом получить либо значение захвата пустой строки.
int, dec = $1, $2_or_blank_string
- это параллельное присваивание .Ruby поддерживает назначение более чем одной переменной одновременно, это не отличается от выполнения int = $1.reversed
, затем dec = $2
Так что int
теперь содержит целую часть (в обратном порядке) и dec
десятичную часть числа.Нас сейчас интересует первая.
Следующая пустая while
выполняет подстановку строки.Метод gsub! заменяет все вхождения регулярного выражения на значение в аргументе secondf.Но он возвращает nil
, если никаких изменений не произошло, что завершает while
.
Выражение /(,|\.|^)(\d{3})(\d)/
соответствует:
(,|\.|^)
Запятая, точка илиначало строки (\d{3})
Три цифры (\d)
Четвертая цифра
Затем она заменяется на \1\2,\3
.\n
в подстановке строк означает n-ю группу захвата, как и переменные $n
.Итак, в основном это так: если у меня четыре цифры, просто добавьте запятую после третьей.Повторяйте до тех пор, пока группа из четырех цифр не будет найдена
Затем просто снова переверните целую часть и добавьте десятичную часть.