if语句未在Ruby中执行

时间:2019-09-08 12:23:31

标签: ruby

我是Ruby编程语言的新手,请我制作一个执行以下操作的小程序: 规则1:如果单词以元音开头,则在单词末尾添加“ ay”声音。

规则2:如果单词以辅音开头,请将其移至单词末尾,然后在单词末尾添加“ ay”声音。

但是在我的if else语句中,即使它为true,它也不会进入else语句中

我已经尝试过将字符串转换为数组并在数组上工作,并尝试按原样在字符串上工作

def translate (str)
    i = 0
    while i < str.length
        if (str[i] == "a" or str[i] == "e" or str[i] == "o" or str[i] == "u" or str[i] == "i")
            str = str + "ay"
            return str
        else
            temp = str[0...1]
            str = str[1...str.length]
            str = str + temp
        end
        i = i + 1
    end

end

s = translate("banana")
puts s

程序完全不输入if语句,并一直进入else语句,直到单词返回相同而没有任何更改

3 个答案:

答案 0 :(得分:0)

如果我对问题的理解正确,那么您根本不需要在此处循环。您只需要检查第一个字母,而不是所有字母。

def translate (str)
  if str[0] == 'a' or str[0] == 'e' or str[0] == 'o' or str[0] == 'u' or str[0] == 'i'
    str + 'ay'
  else
    temp = str[0...1]
    str = str[1...str.length]
    str = str + temp
    str + 'ay'
  end
end

顺便说一句,我能够使用调试器解决这个问题。你有没有尝试过?另外,对于您的原始代码,事实证明,对于某些输入(例如'baaan'),您的else语句执行

答案 1 :(得分:0)

除了我建议使用|| instead of or之外,您的方法不需要#while迭代器,因为您只检查第一个字母。 if / else语句只能执行一次。

您还可以使用单个#include?方法替换所有支票,如下所示:

def translate (str)
   if %w[a e i o u].include?(str[0])
       str + "ay"
   else
       str[1..-1] + str[0] + "ay"
   end
end

请注意,由于将返回上次执行的行,因此我也删除了return语句,因此上述方法中的第3行或第5行。 您还可以添加一个三元运算符以使其成为一行:

 %w(a e i o u).include?(str[0]) ? str + "ay" : str[1..-1] + str[0] + "ay"
  

规则1:如果单词以元音开头,请向   这个词的结尾。

translate("ana")
# ~> "anaay"
  

规则2:如果单词以辅音开头,请将其移到   单词,然后在单词末尾添加“ ay”声音。

translate("banana")
# ~> "ananabay"

答案 2 :(得分:0)

在这种情况下,我没有发现or||有问题。 我看到的问题是,如果起始字母是辅音,则在每次迭代时更改str旋转其字母(请参见代码的注释部分),因此起始字母永远不是元音。 / p>

然后,您最后缺少一个返回值,因此它不返回nilputs

def translate (str)
    i = 0
    while i < str.length
        p str[i] # it's never a vowel
        if (str[i] == "a" or str[i] == "e" or str[i] == "o" or str[i] == "u" or str[i] == "i")
            str = str + "ay"
            return str
        else # here you are rotating the word
            temp = str[0...1]
            str = str[1...str.length]
            str = str + temp
            p str
        end
        i = i + 1
    end
    # missing a return value
end

s = translate("banana")
p s

因此它会打印出来:

# "b"
# "ananab"
# "n"
# "nanaba"
# "n"
# "anaban"
# "b"
# "nabana"
# "n"
# "abanan"
# "n"
# "banana"
# nil

万一第一个字母是元音,该代码可以正常工作,因此它可以输入if true

s = translate("ananas")
p s
#=> "ananasay"

顺便说一句,就像其他人已经发布的一样,您不需要任何while循环。只需使用if语句检查第一个字母就可以了。