通过向后阅读来反转Ruby中的字符串

时间:2018-12-12 03:41:37

标签: ruby-on-rails

我只是在循环和条件(尚未放入数组)中练习和学习。我试图通过连接字母来反转任何字符串,从单词的最后一个字母到第一个字母。例如,对于cat,从t开始,然后从a开始,然后是c以获得tac。

我没有弄清楚代码中有什么问题。我想知道为什么第六行(反向+ =字母)会显示错误消息:

  

6:在'+'中:没有将nil隐式转换为String(TypeError)

什么是零?

def is_reversed(word)
  i = word.length
  reverse = ""
  while i > word.length || i != -1
    letter = word[i]
    reverse += letter
    i = i - 1
  end
  return reverse
end

puts is_reversed("cat") 

3 个答案:

答案 0 :(得分:1)

def is_reversed(word)
  i = word.length
  reverse = ""
  while i > word.length || i != -1
    i = i - 1
    letter = word[i]
    reverse += letter
  end
  return reverse
end

puts is_reversed("cat") 
// will return 'tact'

在上面的循环中,第一次尝试查找要放入索引的word.length字母,该字母实际上不存在,因此返回nil从而引发错误。 要获取字符串的最后一个字母,您必须先执行i = i - 1,然后才能在循环内执行其他任何操作。

第二,我认为您的情况存在缺陷。如果您尝试在红宝石的数组或字符串中的-1处找到元素,它将为您提供最后一个元素。 而且第一个条件i > word.length将永远不会满足,因为i的值为word.length

所以你可以做这样的事情

def is_reversed(word)
  i = word.length
  reverse = ""
  while i > 0
    i = i - 1
    letter = word[i]
    reverse += letter
  end
  return reverse
end

puts is_reversed("cat") 

//returns 'tac'

答案 1 :(得分:1)

这里有一些问题,但最重要的是您循环错误。您可以从数字开始向上计数或从数字向下计数,而您似乎想从word.length开始向下计数。很好,但是让我们看看您实际在做什么。

使用while i > word.length || i != -1时,您正在检查i是否大于单词长度?它将如何获得这种方式(您没有在任何地方添加到i中)以及为什么要进行检查?

由于您选择倒计时,所以我们希望在没有字母剩余时停止。因此,将您的条件更改为while i > 0。现在,仅当剩下的字母需要通过时,我们才会循环。

还有另一个问题-因为索引从0开始,所以在word[i]会得到i == 3的情况下尝试获取nil!因此,您实际上想将i = i - 1移到循环的第一行。

这些更改之后,您应该具有:

def is_reversed(word)
  i = word.length
  reverse = ""
  while i > 0
    i = i - 1
    letter = word[i]
    reverse += letter
  end
  return reverse
end

puts is_reversed("cat") 

答案 2 :(得分:0)

我知道这个问题已经解决了,但是像这样的事情呢?

def is_reversed(w)
  w.split("").each_with_object("").with_index{ |(l,a), i| a << w[(w.length-1-i)] }
end

在控制台中:

is_reversed('this is reversed')
=> "desrever si siht"
is_reversed('and so is this')
=> "siht si os dna"
is_reversed('antidisestablishmentarianism')
=> "msinairatnemhsilbatsesiditna"

注意:

  • 105个字符而不是152
  • 3行而不是10
  • 使用<<代替+=(即faster
  • 避免使用while i > 0位,这是IMO,不是非常惯用的Ruby
  • 避免不必要的变量分配(i = word.lengthreverse = ""i = i - 1letter = word[i]