Вместо того, чтобы использовать конкатенацию строк, необходимо использовать StringBuilder, если код не является поточным, и StringBuffer, если это.
String # rpartition
делает именно это:
name, match, suffix = name.rpartition('.')
Он был введен в Ruby 1.8.7, поэтому при запуске более ранней версии вы можете использовать require 'backports / 1.8. 7 / string / rpartition '
, чтобы это работало.
Наденьте на некоторое время мыслящую шапку и придумайте следующее регулярное выражение:
"what.to.do.now".split(/\.([^.]*)$/)
=> ["what.to.do", "now"]
Или, говоря человеческим языком, «разделить на точку, за которой не следует другая точка, в конце строки». Отлично работает также со строками без точек и последовательностями точек:
"whattodonow".split(/\.([^.]*)$/)
=> ["whattodonow"]
"what.to.do...now".split(/\.([^.]*)$/)
=> ["what.to.do..", "now"]
Вот что я бы на самом деле сделал:
/(.*)\.(.*)/.match("what.to.do")[1..2]
=> ["what.to", "do"]
или, возможно, более условно,
s = "what.to.do"
s.match(/(.*)\.(.*)/)[1..2]
=> ["what.to", "do"]
if this = "what.to.do" вы можете сделать это:
this.split(%r{(.+)\.})
и получите обратно
["", "what.to", "do"]
Если вам нужна буквальная версия rsplit
, вы можете это сделать (отчасти это шутка, но на самом деле это хорошо работает):
"what.to.do".reverse.split('.', 2).map(&:reverse).reverse
=> ["what.to", "do"]