我只是在循环和条件(尚未放入数组)中练习和学习。我试图通过连接字母来反转任何字符串,从单词的最后一个字母到第一个字母。例如,对于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")
答案 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"
注意:
<<
代替+=
(即faster)while i > 0
位,这是IMO,不是非常惯用的Ruby i = word.length
,reverse = ""
,i = i - 1
和letter = word[i]
)