Как вернуть строку с символом при данном индексе? - PullRequest
0 голосов
/ 23 мая 2018

У меня есть строка, например,

string = 'foo-bar'

, и я хочу новую строку, которая не содержит символ в index 3 (- в строке примера), поэтому результаты будут "foobar".Прежняя строка не должна быть изменена.

Это то, что я имею до сих пор:

new_string = string.dup
new_string.slice!(3)
new_string
#=> "foobar"

string
#=> "foo-bar"

или как «однострочник»:

new_string = string.dup.tap { |s| s.slice!(3) }
#=> "foobar"

Нонеобходимость в dup и, возможно, tap выглядит довольно громоздкой.Есть ли более лаконичный способ?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Кажется Kernel#sprintf может решить эту проблему довольно просто:

str = "foo-bar"
sprintf("%3.3s%s",str,str[4..-1])
#=> "foobar"

Или просто

sprintf("%s%s",str[0..2],str[4..-1])
#=> "foobar"

Дополнительно Enumerable методы могут помочь, но кажутся немного излишними, например

str.each_char.with_index.reduce("")  do |memo,(s,i)| 
  i == 3 ? memo : memo << s
end
#=> "foobar"
0 голосов
/ 23 мая 2018

Я не знаю такого метода.Вы можете написать это самостоятельно, используя slice.

at = 3
string = "abc-def"
def delete_at(string, at)
  string.slice(0, at) + string.slice(at + 1, string.length)
end

x = delete_at(string, at) #> "abcdef"

Вы также можете сделать обезьянку патчем для класса String (что мне не нравится)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...