match, text, number = *"foobar 123".match(/([A-z]*) ([0-9]*)/)
Я знаю, что это какое-то соответствие регулярному выражению, но какую роль здесь играет знак, и есть ли способ сделать это без знака, чтобы это было менее запутанным?
match, text, number = *"foobar 123".match(/([A-z]*) ([0-9]*)/)
Я знаю, что это какое-то соответствие регулярному выражению, но какую роль здесь играет знак, и есть ли способ сделать это без знака, чтобы это было менее запутанным?
Есть ли способ сделать это без знака, чтобы было меньше путаницы?
Поскольку a,b = [c,d]
совпадает с a,b = *[c,d]
, а splat вызывает to_a
в своем операнде, когда это не массив, вы можете просто явно вызвать to_a и не нуждаться в splat:
match, text, number = "foobar 123".match(/([A-z]*) ([0-9]*)/).to_a
Не знаю, менее ли это запутанно, но без пятен.
Знак разбивает результаты сопоставления регулярных выражений (MatchData
с тремя группами: весь шаблон, буквы и числа) на три переменные. Таким образом, мы получаем:
match = "foobar 123"
text = "foobar"
number = "123"
Без знака был бы только один результат (MatchData
), поэтому Ruby не знал бы, как присвоить его трем отдельным переменным.
В документации для MatchData есть хорошее объяснение:
Поскольку to_a вызывается при раскрытии *variable, есть полезный ярлык присваивания для извлечения совпадающих полей. Это немного медленнее, чем прямой доступ к полям (поскольку генерируется промежуточный массив).
all,f1,f2,f3 = *(/(.)(.)(\d+)(\d)/.match("THX1138.")) all #=> "HX1138" f1 #=> "H" f2 #=> "X" f3 #=> "113"
String.match возвращает объект MatchData, содержащий все совпадения регулярного выражения. Оператор splat разбивает этот объект и возвращает все совпадения по отдельности.
Если вы просто бежите
"foobar 123".match(/([A-z]*) ([0-9]*)/)
в irb вы можете увидеть объект MatchData с собранными совпадениями.
MatchData - это специальная переменная, для всех намерений и целей массив (вроде), так что вы можете сделать это и так:
match, text, number = "foobar 123".match(/([A-z]*) ([0-9]*)/)[0..2]
Подробнее о специальной переменной MatchData
[]
для экземпляра MatchData, поскольку он определяет []
, и вы можете использовать для него оператор splat, поскольку он определяет to_a
.
- person sepp2k; 22.09.2009
[A-z]*
и[0-9]*
, то это не знаки, а часть регулярного выражения. - person Jon Skeet   schedule 21.09.2009