На мой взгляд, это плохая практика. Основная причина - интеграция. Quoting should.js docs:
OMG IT EXTENDS OBJECT ???!?! @ Да, да, да, с одним геттером, и нет, он не сломает ваш код
blockquote>Ну, как может автор знать? Что, если мои издевательские рамки делают то же самое? Что, если мои обещания lib делают то же самое?
Если вы делаете это в своем собственном проекте, тогда все в порядке. Но для библиотеки это плохой дизайн. Underscore.js - пример того, что сделано правильно:
var arr = []; _(arr).flatten() // or: _.flatten(arr) // NOT: arr.flatten()
Попробуйте следующее:
res = []
"abab".scan(/a/) do |c|
res << [c, $~.offset(0)[0]]
end
res.inspect # => [["a", 0], ["a", 2]]
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]