2016-05-30 8 views
1

文字列を取り、すべての文字を次の文字に変更し、母音を大文字にして同じ文字列を返すコードを書いています。しかし、私はそれを実行しようとすると、母音は私が期待するように大文字に見えません。Ruby - str.upcaseがwhileループで動作しません

これは私のコードです:私のコードが機能しない理由

def LetterChanges(str)   
    str = str.downcase.split (" ") 

    str.each do |word| 
     i = 0 
     while i < word.length 
      word[i] = word[i].next 
      word[i].upcase! if word[i] =~ /[aeiou]/ 
      i += 1 
     end 
    end 

    return str.join(" ") 
end 

LetterChanges("helo world") 

誰も教えてもらえますか?

+0

あなたが与えられ、たとえば所望の出力を提出することはできますか? –

+0

@ sagarpandya82この場合の望ましい出力は "Ifmp xpsmE" –

答えて

1

[]メソッドで文字列の一部にアクセスすると、文字列のその部分の部分へのポインタではなく、新しい文字列が返されます。

次のことで、これを見ることができます:

str = "abcdefgh" 
str[5]    # "f" 
str[5].upcase!  # "F" 
str     # "abcdefgh" 

upcase!方法が唯一あなたがstr[5]を呼び出したときに返される新しい文字列、f、に取り組んでいます。元の文字列とは別の新しい文字列であるため、元の文字列は変更されません。

は、代わりにあなたのような何かを使用することができます。

def LetterChanges(str) 
    str.gsub(/[aeiou]/) {|letter| letter.next.upcase } 
end 
+0

ああ....私は今理解しています。だからgsubの代わりに '.each'を使うと同じ文字列になります。 –

+0

' gsub'は与えられた正規表現に基づいて文字列内のマッチを見つけています。ブロックによって返される値は、マッチが置き換えられる値です。 'gsub'は元の文字列を変更するのではなく、一致するビットを置き換えた新しい文字列を返します。 – br3nt

0
def LetterChanges(str) 
    str = str.downcase.split (" ") 
    str.each do |word| 
     i = 0 
     while i < word.length  
      word[i] = word[i].next  
      word[i] = word[i].upcase! if word[i] =~ /[aeiou]/ 
      i += 1 
     end 
    end 

    return str.join(" ") 
end 

LetterChanges("helo world") 

があなたのprobleを解決する...

関連する問題