为什么我的while循环卡住了?我忘记了一步吗?

时间:2013-09-04 18:51:05

标签: ruby string rspec while-loop infinite

我仍在努力完成一些练习,我确信这不是第一次在堆叠中提出这个问题......但我有兴趣按照我的方式追求这个问题解释写代码所以我希望得到一些帮助,找出如何使我的方法工作。

这是猪拉丁人:) 基本上。如果你在变量中加入一个单词......或者两个单词,它应该将这些单词翻译成所谓的猪拉丁语。猪拉丁接受了一个像你好的话,并改为ellohay。在拉丁语中,单词必须以元音开头。所以你甚至可以说“关闭”这个词,它应该说“osedclay”。我决定用while循环来解决这个问题。虽然我的rspec检查适用于前两个检查...当它开始检查第三个单词时(似乎是“樱桃”),它似乎陷入无限循环中

有人想到吗?

def translate(word)
separated = word.split("")
while separated[0] !=("a" || "e" || "i" || "o" || "u")
    letter = separated.shift
    separated << letter
    separated
end
    word = separated.join("")
    word + "ay"
end

1 个答案:

答案 0 :(得分:4)

!=运算符不会按照您的想法运行。

while separated[0] !=("a" || "e" || "i" || "o" || "u")

上面的行相当于

while separated[0] != 'a'

如果你的单词中没有“a”,循环就是无限的。你应该重写你的条件

while !'aeiou'.include?(separated[0])

我知道,我会使用正则表达式......

这是方法的更短版本

def translate(word)
  # you can make one-liner out of it.
  leading_consonants_regex = /^([bcdfghjklmnpqrstvwxyz]+)(.*)/
  word.sub(leading_consonants_regex, '\\2\\1ay')
end

translate('sheep') # => "eepshay"
translate('dog') # => "ogday"
translate('closed') # => "osedclay"
translate('cherry') # => "errychay"