数组find_index返回nil,即使值明显在数组中

时间:2015-04-15 22:36:14

标签: ruby-on-rails ruby arrays

我正在接受Coderbyte的编程挑战:

  

使用Ruby语言,使用函数LetterChanges(str)获取传递的str参数,并使用以下算法对其进行修改。将字符串中的每个字母替换为字母表后面的字母(即c变为d,z变为a)。然后大写这个新字符串(a,e,i,o,u)中的每个元音,最后返回这个修改后的字符串。

我的代码如下:

def LetterChanges(str)
  alphabet = ('a'..'z').to_a
  result = ""
  str = str.each_char do |c|
    idx = alphabet.find_index(c)
    if idx != nil
      idx == 25 ? idx = 0 : idx += 1
      c = alphabet[idx]
      c.upcase! if ["a","e","i","o","u"].include?(c)
    end
    result << c
  end
  return result 
end

当我运行LetterChanges的代码时(&#34; coderbyte&#34;),它返回&#39; dpEesczUe&#39;。我做了一些测试并实现了alphabet.find_index(&#34; e&#34;)将返回nil。但是,当我运行代码LetterChanges(&#34; eeeee&#34;)时,它会返回&#39; fffff&#39;正如所料。必须有一些我想念的东西,我只能弄清楚是什么!

2 个答案:

答案 0 :(得分:4)

你在做:

c = alphabet[idx]

alphabet

中选取一个字符

然后执行c.upcase!将修改alphabet中的条目,以便在“coderbyte”alphabet[4](“e”)的“d”更改为“E”之后所以当你试图在alphabet中找到“e”时,它就不再存在了。

有很多方法可以稍微修改代码来解决这个问题,但一种方法是更改​​为使用c = alphabet[idx].dup或更改为可以使用upcase代替upcase! <的方法/ p>

答案 1 :(得分:2)

更简单的实施

def LetterChanges(str)
    str.tr('a-z','b-zA').gsub(/[aeiou]/){|c| c.capitalize}
end