1

我想在一个块中使用的 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 告诉我粗体标记的“替换”是分配后未使用的局部变量。所以问题似乎是块内的 if 条件。我做错什么了?

4

2 回答 2

2

replace=replace[0...-1]只是更改块中的局部变量引用的字符串,而不是更新数组中的条目。有几个解决方案。

一种是使用each_with_index和更新数组中的实际字符串:

例如

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 的答案也适用于可以在修改现有字符串的方法上完成所需的字符串操作的场景,就像这里的情况一样。

于 2012-05-24T11:11:23.440 回答
1

如果您each使用就地更改字符串的方法(而不是生成更改的副本),则可以使用:

words = %w[ACH-92941100 ACH-92941102]
words.each{|word| word.chop! if word.count('1234567890') == 8 }
p words  #=> ["ACH-9294110", "ACH-9294110"]
于 2012-05-24T16:17:21.737 回答