如何在不修改原字符串的情况下移除指定索引的字符?
当然有更简洁的实现方式!不用dup和tap也能轻松搞定,而且完全不会改动原字符串,给你推荐几种Ruby风格的写法:
1. 切片拼接(最直观高效)
直接通过字符串切片截取目标前后的部分再拼接,这是最简洁也最易读的方式:
string = 'foo-bar' new_string = string[0...3] + string[4..-1] # => "foobar" string # => "foo-bar" # 原字符串完好无损
解释一下:[0...3]取的是索引0到2的字符(左闭右开,不包含索引3),[4..-1]则是从索引4一直取到字符串末尾,两者拼接就自动跳过了索引3的字符。
2. 转数组过滤后拼接
如果需要更灵活的条件(比如跳过多个索引),可以把字符串转成字符数组,过滤掉指定索引的元素后再拼接回去:
new_string = string.chars.reject.with_index { |_, idx| idx == 3 }.join # => "foobar"
这种写法扩展性更强,比如要跳过索引3和5的字符,只需要把条件改成idx == 3 || idx ==5就行。
3. 紧凑链式写法
如果你偏好链式调用,也可以用dup搭配delete_at写成一行,比tap的写法更直观:
new_string = string.dup.delete_at(3) # => "foobar"
虽然用到了dup,但写法比tap版本更紧凑,逻辑清晰:先复制原字符串,再删除复制版的指定索引字符,原字符串不受影响。
对比下来,第一种切片拼接的方式是最适合你的需求的——代码短、效率高,一眼就能看懂逻辑。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

