Принимая это медленно, \d соответствует любой цифре. Он во второй группе захвата, поэтому \2* затем соответствует любым последующим появлениям той же цифры. Это создает массив, который выглядит как
Поскольку нам нужен только первый элемент в каждом из этих вспомогательных массивов, мы можем собрать их все с помощью map(&:first).
(Обратите внимание, что str.scan(/(\d)\1*/) просто создаст массив из первой группы захвата, а это означает, что мы получим только одну цифру из последовательности, возможно, повторяющихся чисел.)