Получить индекс результатов сканирования строки в ruby

На мой взгляд, это плохая практика. Основная причина - интеграция. Quoting should.js docs:

OMG IT EXTENDS OBJECT ???!?! @ Да, да, да, с одним геттером, и нет, он не сломает ваш код

Ну, как может автор знать? Что, если мои издевательские рамки делают то же самое? Что, если мои обещания lib делают то же самое?

Если вы делаете это в своем собственном проекте, тогда все в порядке. Но для библиотеки это плохой дизайн. Underscore.js - пример того, что сделано правильно:

var arr = [];
_(arr).flatten()
// or: _.flatten(arr)
// NOT: arr.flatten()
13
задан Jørgen R 13 February 2015 в 11:18
поделиться

2 ответа

Попробуйте следующее:

res = []
"abab".scan(/a/) do |c|
  res << [c, $~.offset(0)[0]]
end

res.inspect # => [["a", 0], ["a", 2]]
23
ответ дан 1 December 2019 в 19:39
поделиться

It surprised me that there isn't any method similar to String#scan which would return array of MatchData objects, similar to String#match. So, if you like monkey-patching, you can combine this with Todd's solution (Enumerator is introduced in 1.9):

class Regexp
  def scan str
    Enumerator.new do |y|
      str.scan(self) do
        y << Regexp.last_match
      end
    end
  end
end
#=> nil
/a/.scan('abab').map{|m| m.offset(0)[0]}
#=> [0, 2]
1
ответ дан 1 December 2019 в 19:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: