Вставить несколько символов в строку одновременно - PullRequest
0 голосов
/ 07 июня 2018

Где str [] заменит символ, str.insert вставит символ в позицию.Но это требует двух строк кода:

str = "COSO17123456"
str.insert 4, "-"
str.insert 7, "-"
=> "COSO-17-123456"

Я думал, как сделать это в одной строке кода.Я придумал следующее решение:

str =  "COSO17123456"
str.each_char.with_index.reduce("") { |acc,(c,i)| acc += c + ( (i == 3 || i == 5) ? "-" : "" ) }
  => "COSO-17-123456 

Есть ли встроенный помощник Ruby для этой задачи?Если нет, я должен придерживаться опции вставки, а не комбинировать несколько итераторов?

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Вы можете использовать срезы и .join:

> [str[0..3], str[4..5],str[6..-1]].join("-")
=> "COSO-17-123456"

Обратите внимание, что индекс после первого (между 3 и 4) будет другим, так как вы не вставляете более раннюю вставку первой.т. е. более естественным (для меня в любом случае ...)

Вы будете вставлять по абсолютному индексу исходной строки, а не по относительному индексу, поскольку вставки сделаны.

Если вы хотите вставить при определенных абсолютных значениях индекса, вы также можете использовать ..each_with_index и управлять поведением символ за символом:

str2 = ""
tgts=[3,5]
str.split("").each_with_index { |c,idx| str2+=c; str2+='-' if tgts.include? idx }

Оба из вышеперечисленных создают новую строку.

0 голосов
/ 08 июня 2018

String#insert возвращает саму строку.

Это означает, что вы можете связывать вызовы методов, которые могут быть красивее и эффективнее, если вам нужно сделать это только пару раз, как в вашем примере:

str = "COSO17123456".insert(4, "-").insert(7, "-")
puts str
COSO-17-123456

Ваша reduce версия может быть поэтому более кратко записана как:

[4,7].reduce(str) { |str, idx| str.insert(idx, '-') }

Я приведу еще один вариант в таблицу, String#unpack:

new_str = str.unpack("A4A2A*").join('-')
# or with String#%
new_str = "%s-%s-%s" % str.unpack("A4A2A*")
0 голосов
/ 07 июня 2018

Используйте each для перебора массива индексов:

str = "COSO17123456"
[4, 7].each { |i| str.insert i, '-' }
str #=> "COSO-17-123456"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...