Подумайте об использовании:
map
как "" Я хочу создать новые данные на основе существующих данных " each
как «Я либо не хочу изменять какие-либо данные, либо изменить существующие данные»
Имея это в виду, вы используете map
с массивом для создания нового массивана основе существующего, а затем с помощью each
изменить символы в существующих строках. Вот почему строки в исходном массиве в конечном итоге модифицируются.
Чтобы исправить это, дважды используйте map
, сначала «создать новый массив на основе существующего массива», а затем второй раз «создать новую строку». на основе существующей строки ". Таким образом, исходные строки не будут изменены.
def removal(arr)
letters ="i"
p arr
new_array = arr.map do |word|
word.chars.map do |char|
letters.include?(char) ? '*' : char
end.join
end
p arr
p new_array
end
removal(["hiiiiiigh","git", "training"]) #=> ["hiiiiiigh", "git", "training"]
# ["hiiiiiigh", "git", "training"]
# ["h******gh", "g*t", "tra*n*ng"]
Более практичным решением этой проблемы было бы что-то вроде этого:
def censor(strings, forbidden_chars_string, censor_char = '*')
re = Regexp.union(forbidden_chars_string.chars)
strings.map {|str| str.gsub(re, censor_char) }
end
p ["hiiiiiigh","git", "training"] #=> ["hiiiiiigh", "git", "training"]
p censor(["hiiiiiigh","git", "training"], "i") #=> ["h******gh", "g*t", "tra*n*ng"]
p censor(["hiiiiiigh","git", "training"], "gn", '_') #=> ["hiiiiii_h", "_it", "trai_i__"]