3

このコード例を使用する

#!/usr/bin/ruby
paragraph = "champion xylophone excellent"
paragraph = paragraph.gsub("ch","tj")
words = paragraph.split(/ /)
words.each do |word|
   if word[0,1] == "x"
     word[0.1] = "z" 
   end
end
paragraph = words.join(" ")
paragraph.gsub("x","ks")
print paragraph

出力は、「tjampion zylophone ekscellent」ではなく、「tjampionzylophoneexcellent」になります。

gsubがそれぞれの中で個々の単語に適用される場合も同じことが当てはまります。なぜ最初に作用するのか、最後には作用しないのかわかりません。

編集

2番目のケースは、最初のケースとは異なる問題です。

#!/usr/bin/ruby
paragraph = "champion xylophone excellent"
paragraph = paragraph.gsub("ch","tj")
words = paragraph.split(/ /)
words.each do |word|
   if word[0,1] == "x"
     word[0.1] = "z" 
   end
   word = word.gsub("x","ks")
end
paragraph = words.join(" ")
print paragraph
4

4 に答える 4

5

gsubを最初に使用するときは、それをparagrahに割り当てます。

paragraph = paragraph.gsub("ch","tj")

2回目に割り当てが欠落している

paragraph.gsub("x","ks")に変更

paragraph = paragraph.gsub("x","ks")
于 2012-04-13T13:35:44.507 に答える
2

コードが誤って機能しています。動作部分は、文字列を変更する文字列のメソッドを使用します。動作していない部分は、新しい文字列(破棄される)を生成するメソッドを使用します。これは紛らわしいです。より良い方法はmap、目的の結果が配列である場合に使用することです。これには、変更された文字列または新しい文字列のいずれかのブロックの結果が含まれます。

paragraph = "champion xylophone excellent"
words = paragraph.split(' ').map do |word|
  word.gsub('ch','tj') #new string
  word[0.1] = "z" if word.start_with?('x') #modified string
  word.gsub!('x','ks') #modified string
end
puts words.join(' ')
于 2012-04-13T14:14:04.333 に答える
2
paragraph.gsub!("x","ks")
puts paragraph

または、RegExpを使用します(1行の操作ですべてを実行できます)。

paragraph = "champion xylophone excellent"
paragraph = paragraph.gsub("ch","tj").gsub(/([\A\s])x(\w*)/){$1 + 'z'+ $2}.gsub("x","ks")

puts paragraph
于 2012-04-13T13:44:55.080 に答える
0

破壊的にしたい場合gsub、つまり、それが呼び出された変数の値を変更したい場合は、を使用しますgsub!。それで:

paragraph.gsub!('ch', 'tj')

それよりも:

paragraph = paragraph.gsub('ch', 'tj')

それはより簡潔であり、Ruby開発者はbang(!)メソッドを破壊的であると認識しています。そしてあなたの場合、あなたgsub!は両方の呼び出しの代わりにメソッドが必要ですgsub

于 2012-04-13T13:40:54.660 に答える