如何替换块中的字符串

时间:2012-05-24 11:05:33

标签: ruby arrays string if-statement block

我想在块中使用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条件。我做错了什么?

2 个答案:

答案 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"]