首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的程序在将一个特定的字符串赋给一个变量时无限循环,我不知道为什么

我的程序在将一个特定的字符串赋给一个变量时无限循环,我不知道为什么
EN

Stack Overflow用户
提问于 2016-01-26 18:19:22
回答 1查看 60关注 0票数 0

我正在尝试用Test-First材料学习Ruby,但我被困在这一点上了。这是我的代码:

代码语言:javascript
复制
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。

我将非常感谢你的一些见解。

EN

回答 1

Stack Overflow用户

发布于 2016-01-26 19:24:37

请注意,

代码语言:javascript
复制
letter == ("a" || "e" || "i" || "o" || "u")

等同于

代码语言:javascript
复制
letter == "a"

因为("a" || "e" || "i" || "o" || "u")将计算为第一个真值,在本例中恰好为"a"

你需要的是

代码语言:javascript
复制
(letter == "a") || (letter == "e") || (letter == "i") || (letter == "o") || (letter == "u")

它也可以写成:

代码语言:javascript
复制
["a","e","i","o","u"].include?(letter)

代码语言:javascript
复制
%w(a e i o u).include?(letter)

代码语言:javascript
复制
"aeiou".chars.include?(letter)

由于上面提到的逻辑错误,每当letter不是"a"时,vowel方法将返回nil,如果有一个单词不包含元音a,则while循环永远不会终止。因此,需要将其更正为类似下面的内容。同时,让我们在方法名中添加?,以表明它将返回一个布尔值。

代码语言:javascript
复制
def vowel?(letter)
  "aeiou".chars.include?(letter)
end

使用如下代码也可以简化将字符串的第一个字符移动到字符串末尾的操作:

代码语言:javascript
复制
word = word[1..-1].concat(word[0])

让我们将此逻辑提取到一个新方法中:

代码语言:javascript
复制
def rotate(word)
    word[1..-1].concat(word[0])
end

您还可以通过切换到until表达式来简化while循环。

代码语言:javascript
复制
word = rotate(word) until vowel?(word.chars.first)

因此,您的translate方法可以简化为如下所示:

代码语言:javascript
复制
def translate(word)
  word = rotate(word) until vowel?(word.chars.first)
  word.concat("ay")
end

还有一个问题,没有任何元音的单词会发生什么情况,循环将是无限循环。我们需要解决这个问题

代码语言:javascript
复制
def translate(word)
  if word.chars.any? { |i| vowel?(i) }  
    word = rotate(word) until vowel?(word.chars.first)
  end
  word.concat("ay")
end

完整代码:

代码语言:javascript
复制
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"]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35011518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档