Я использую ruby 1.9.2.
gsub
/ scan
перебирает совпадения с заданным регулярным выражением / строкой и используется тремя способами:
- Если
scan
используется без блока, он возвращает массив совпадений.
- Если
scan
используется с блоком, он перебирает совпадения и выполняет что-то.
- Если используется
gsub
, он заменяет совпадения на то, что указано в качестве второго аргумента или блока, и возвращает строку.
С другой стороны, есть split
, который соответствует дополнению к тому, что gsub
/ scan
соответствует. Однако есть только один способ использовать это:
- Если
split
используется без блока, он возвращает массив дополнений совпадений.
Я хотел, чтобы два других пропущенных употребления относились к split
, и попытался их реализовать. Следующий every_other
расширяет split
, так что его можно использовать как scan
.
class String
def every_other arg, &pr
pr ? split(arg).to_enum.each{|e| pr.call(e)} : split(arg)
end
end
# usage:
'cat, two dogs, horse, three cows'.every_other(/,\s*/) #=> array
'cat, two dogs, horse, three cows'.every_other(/,\s*/){|s| p s} # => executes the block
Затем я попытался реализовать аналог gsub
, но не смог сделать это хорошо.
class String
def gsub_other arg, rep = nil, &pr
gsub(/.*?(?=#{arg}|\z)/, *rep, &pr)
end
end
# usage
'cat, two dogs, horse, three cows'.gsub_other(/,\s*/, '[\1]') # or
'cat, two dogs, horse, three cows'.gsub_other(/,\s*/) {|s| "[#{s}]"}
# Expected => "[cat], [two dogs], [horse], [three cows]"
# Actual output => "[cat][],[ two dogs][],[ horse][],[ three cows][]"
- Что я делаю не так?
- Правильный ли этот подход? Есть ли лучший способ сделать это, или уже есть методы, которые делают это?
- У вас есть предложения по поводу названий методов?