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

标签 ruby string rspec while-loop infinite

我仍在努力完成一些练习,我确信这不是第一次在堆栈中提出这个问题......但我有兴趣以我希望的方式解决这个问题解释以编写代码,因此我希望得到一些帮助来弄清楚如何使我的方法起作用。

这是拉丁 pig :) 基本上。如果你在变量中输入一个词......或两个词,它应该将这些词翻译成所谓的 pig 拉丁语。 Pig latin 将 hello 之类的词改为 ellohay。在 pig 拉丁语中,单词必须以元音开头。所以你甚至可以用“closed”这个词,它应该是“osedclay”。我决定用一个 while 循环来解决这个问题。虽然我的 rspec 检查适用于前两次检查......当它开始检查第三个单词(恰好是“cherry”)时,它似乎陷入了无限循环

有什么想法吗?

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

最佳答案

!= 运算符并不像您想象的那样工作。

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"

关于ruby - 为什么我的 while 循环卡住了?我忘记了一步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18621569/

相关文章:

ruby - rspec 给出未定义的方法

ruby-on-rails - 使用 Capybara 检查复选框

ruby - Ansicon 不适用于 Windows 8

ruby-on-rails - 仅在生产中,Sidekiq 启动延迟作业但不发送电子邮件

c++ - 传递从 std::string 转换为 wstring 的路径时,CreateProcess 失败

javascript - AJAX 响应 XML

ruby - Octopress 错误 - rake 预览、观察或生成

ruby-on-rails - rails : Facebox link if condition is satisfied

python - 如何仅在python中比较两个字符串与某些字符

ruby-on-rails - 在 Rails 测试环境中调用方法后对象为 nil