我正在尝试用Test-First材料学习Ruby,但我被困在这一点上了。这是我的代码:
def translate(word)
word=word.split("")
while (!vowel(word[0])) do
first_letter=word[0]
word.each_index do |i|
word[i]=word[i+1]
end
word[word.length-1]=first_letter
end
return word.join + "ay"
end
def vowel(letter)
if letter == ("a" || "e" || "i" || "o" || "u")
return true
end
end我们的目标是实现一个函数,通过查看单词是否以元音开头,将单词翻译为"pig拉丁语“。如果是这种情况,该函数仅附加"ay“。如果它以辅音开头,它会将第一个字母放在单词的末尾,直到第一个位置有元音为止。
我遇到的问题开始于将我在while循环开始时保存的第一个字母赋值给单词的最后一个位置。
word[word.length-1]=first_letter
这会导致程序无限循环。
该测试基于字符串"banana",处理后应为"ananabay“。在本例中,first_letter包含"b“。所以我测试了将不同的字母分配到word的最后一个位置,除了"b“之外的所有东西都运行得很好。我不明白的是,while块并不依赖于单词的最后一个字母,而是单词的第一个字母,它仍然会导致一个无限循环,将"b“赋值给wordword.length-1。
我将非常感谢你的一些见解。
发布于 2016-01-26 19:24:37
请注意,
letter == ("a" || "e" || "i" || "o" || "u")等同于
letter == "a"因为("a" || "e" || "i" || "o" || "u")将计算为第一个真值,在本例中恰好为"a"。
你需要的是
(letter == "a") || (letter == "e") || (letter == "i") || (letter == "o") || (letter == "u")它也可以写成:
["a","e","i","o","u"].include?(letter)或
%w(a e i o u).include?(letter)或
"aeiou".chars.include?(letter)由于上面提到的逻辑错误,每当letter不是"a"时,vowel方法将返回nil,如果有一个单词不包含元音a,则while循环永远不会终止。因此,需要将其更正为类似下面的内容。同时,让我们在方法名中添加?,以表明它将返回一个布尔值。
def vowel?(letter)
"aeiou".chars.include?(letter)
end使用如下代码也可以简化将字符串的第一个字符移动到字符串末尾的操作:
word = word[1..-1].concat(word[0])让我们将此逻辑提取到一个新方法中:
def rotate(word)
word[1..-1].concat(word[0])
end您还可以通过切换到until表达式来简化while循环。
word = rotate(word) until vowel?(word.chars.first)因此,您的translate方法可以简化为如下所示:
def translate(word)
word = rotate(word) until vowel?(word.chars.first)
word.concat("ay")
end还有一个问题,没有任何元音的单词会发生什么情况,循环将是无限循环。我们需要解决这个问题
def translate(word)
if word.chars.any? { |i| vowel?(i) }
word = rotate(word) until vowel?(word.chars.first)
end
word.concat("ay")
end完整代码:
def translate(word)
if word.chars.any? { |i| vowel?(i) }
word = rotate(word) until vowel?(word.chars.first)
end
word.concat("ay")
end
def rotate(word)
word[1..-1].concat(word[0])
end
def vowel?(letter)
"aeiou".chars.include?(letter)
end
p translate("banana")
#=> "ananabay"
p ["pig", "banana", "trash", "happy", "duck", "glove"].map(&method(:translate))
#=> ["igpay", "ananabay", "ashtray", "appyhay", "uckday", "oveglay"]https://stackoverflow.com/questions/35011518
复制相似问题