2016-05-30 130 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!方法是在新的字符串,f,當你調用str[5]其返回唯一的工作。由於它是與原始字符串分離的新字符串,因此原始字符串保持不變。

相反,你可以使用類似:

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

嗯....我現在明白了。因此,如果我使用'.each',而不是gsub,它仍然是被修改的同一個字符串。 –

+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 ...