1

ブロック内で使用したい if 条件に問題があります。より正確には、配列から文字列を取得し、その文字列を変更して、特定の条件が満たされた場合に配列に保存したいと考えています。

文字列で構成される「leuchtturmgesamtheit」という配列があります。これらの文字列のほとんどは次のようになります。

ACH-92941100

ACH-92941102

私の目的は、これら 2 つの文字列を集約することです。そのため、文字列の名前を変更して、同じ名前になるようにします。そのためには、最後の文字を切り取りたいです。その後、uniqを使用できます!アレイ上。

これが私がしたことです:

leuchtturmgesamtheit.each { |replace|

  if replace.count("1234567890")==8
    replace=replace[0...-1]
  end

}

leuchtturmgesamtheit.uniq!

print leuchtturmgesamtheit

私は得ると思っていました:

ACH-9294110

しかし、代わりに同じ 2 つの文字列が返されます。

RubyMine は、太字でマークされた「replace」が代入後に使用されないローカル変数であることを示しています。したがって、問題はブロック内の if 条件にあるようです。私は何を間違えましたか?

4

2 に答える 2

2

replace=replace[0...-1]ブロック内のローカル変数が参照する文字列を変更するだけで、配列内のエントリを更新していません。いくつかの解決策があります。

each_with_index1 つは、配列内の実際の文字列を使用して更新することです。

例えば

leuchtturmgesamtheit.each_with_index do |replace, index|
  if replace.count("1234567890") == 8
    leuchtturmgesamtheit[index] = replace[0...-1]
  end
end

もう1つは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 に答える