При чем здесь шлепок?

match, text, number = *"foobar 123".match(/([A-z]*) ([0-9]*)/)

Я знаю, что это какое-то соответствие регулярному выражению, но какую роль здесь играет знак, и есть ли способ сделать это без знака, чтобы это было менее запутанным?


person uzo    schedule 21.09.2009    source источник
comment
Какой шлепок? В вашем примере их три.   -  person shoover    schedule 21.09.2009
comment
Шувер: ты уверен? Если вы имеете в виду [A-z]* и [0-9]*, то это не знаки, а часть регулярного выражения.   -  person Jon Skeet    schedule 21.09.2009


Ответы (5)


Есть ли способ сделать это без знака, чтобы было меньше путаницы?

Поскольку 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

Не знаю, менее ли это запутанно, но без пятен.

person sepp2k    schedule 21.09.2009

Знак разбивает результаты сопоставления регулярных выражений (MatchData с тремя группами: весь шаблон, буквы и числа) на три переменные. Таким образом, мы получаем:

match = "foobar 123"
text = "foobar"
number = "123"

Без знака был бы только один результат (MatchData), поэтому Ruby не знал бы, как присвоить его трем отдельным переменным.

person Jon Skeet    schedule 21.09.2009

В документации для MatchData есть хорошее объяснение:

Поскольку to_a вызывается при раскрытии *variable, есть полезный ярлык присваивания для извлечения совпадающих полей. Это немного медленнее, чем прямой доступ к полям (поскольку генерируется промежуточный массив).

   all,f1,f2,f3 = *(/(.)(.)(\d+)(\d)/.match("THX1138."))
   all   #=> "HX1138"
   f1    #=> "H"
   f2    #=> "X"
   f3    #=> "113"
person Pesto    schedule 21.09.2009

String.match возвращает объект MatchData, содержащий все совпадения регулярного выражения. Оператор splat разбивает этот объект и возвращает все совпадения по отдельности.

Если вы просто бежите

"foobar 123".match(/([A-z]*) ([0-9]*)/)

в irb вы можете увидеть объект MatchData с собранными совпадениями.

person tobiasvl    schedule 21.09.2009

MatchData - это специальная переменная, для всех намерений и целей массив (вроде), так что вы можете сделать это и так:

match, text, number = "foobar 123".match(/([A-z]*) ([0-9]*)/)[0..2]

Подробнее о специальной переменной MatchData

person Julian H    schedule 21.09.2009
comment
Это класс, а не переменная (ну, технически это константа, указывающая на класс, но то же самое относится и к String, Array и т. д.), и в этом нет ничего особенного. Вы можете вызвать [] для экземпляра MatchData, поскольку он определяет [], и вы можете использовать для него оператор splat, поскольку он определяет to_a. - person sepp2k; 22.09.2009