我想在块中使用if条件时遇到问题。更准确地说,我想从数组中获取一个字符串,如果某个条件成立,则更改该字符串并将其保存回数组。
我有一个名为“leuchtturmgesamtheit”的数组,它由字符串组成。 大多数字符串看起来像这样:
ACH-92941100
ACH-92941102
我的目标是聚合这两个字符串。这就是为什么我想重命名字符串,以便它们具有相同的名称。要做到这一点,我想剪掉最后一个角色。之后我可以使用uniq!在阵列上。
这是我做的:
leuchtturmgesamtheit.each { |replace|
if replace.count("1234567890")==8
replace=replace[0...-1]
end
}
leuchtturmgesamtheit.uniq!
print leuchtturmgesamtheit
我希望得到:
ACH-9294110
但我得到了相同的两个字符串。
RubyMine告诉我,标记为“replace”的粗体是赋值后未使用的局部变量。所以问题似乎是块内的if条件。我做错了什么?
答案 0 :(得分:2)
replace=replace[0...-1]
仅更改块中的局部变量引用的字符串,并且不更新数组中的条目。有几种解决方案。
一种是使用each_with_index
并更新数组中的实际字符串:
e.g。
leuchtturmgesamtheit.each_with_index do |replace, index|
if replace.count("1234567890") == 8
leuchtturmgesamtheit[index] = replace[0...-1]
end
end
另一种方法是使用map!
更新数组,例如
leuchtturmgesamtheit.map! do |entry|
if entry.count("1234567890") == 8
entry[0...-1]
else
entry
end
end
steenslag's answer也适用于需要对修改现有字符串的方法进行字符串操作的场景,如下所示。
答案 1 :(得分:1)
如果您使用的方法可以就地修改字符串(而不是生成更改的副本),则可以使用each
:
words = %w[ACH-92941100 ACH-92941102]
words.each{|word| word.chop! if word.count('1234567890') == 8 }
p words #=> ["ACH-9294110", "ACH-9294110"]