разделенные функции - PullRequest
       4

разделенные функции

0 голосов
/ 31 марта 2011

Я использую ruby ​​1.9.2.

gsub / scan перебирает совпадения с заданным регулярным выражением / строкой и используется тремя способами:

  1. Если scan используется без блока, он возвращает массив совпадений.
  2. Если scan используется с блоком, он перебирает совпадения и выполняет что-то.
  3. Если используется gsub, он заменяет совпадения на то, что указано в качестве второго аргумента или блока, и возвращает строку.

С другой стороны, есть split, который соответствует дополнению к тому, что gsub / scan соответствует. Однако есть только один способ использовать это:

  1. Если 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][]"
  • Что я делаю не так?
  • Правильный ли этот подход? Есть ли лучший способ сделать это, или уже есть методы, которые делают это?
  • У вас есть предложения по поводу названий методов?

1 Ответ

0 голосов
/ 31 марта 2011

Это не красиво, но, кажется, работает

s='cat, two dogs, horse, three cows'
deli=",\s"
s.gsub(/(.*?)(#{deli})/, '[\1]\2').gsub(/(.*\]#{deli})(.*)/, '\1[\2]')

=> "[cat], [two dogs], [horse], [three cows]"

Следующий чувствует себя немного лучше

s.split(/(#{deli})/).map{|s| s!=deli ? "[#{s}]" : deli}.join
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...