2016-05-30 154 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 ...