我正在寻找一些帮助,以便在尝试使用for循环搜索字母数组(并将它们添加到结果字符串中)时理解为什么会出现错误(没有将nil隐式转换为String) ,这似乎是真正的问题),但不是当我使用while循环或每个'出于同样的目的。我查看过很多文档,但是还没有找到答案为什么会发生这种情况。我知道我可以使用"每个"方法,并称它为一天,但我更喜欢理解原因和效果(并希望将来避免这个问题)。
以下方法可以根据需要使用:打印"结果"这是原始字符串,只有"!"代替任何元音。
s="helloHELLO"
result=""
vowels=["a","e","i","o","u","A","E","I","O","U"]
string_array=s.split("")
string_array.each do |i|
if vowels.include?(i)
result+="!"
else
result+=i
end
end
puts result
然而,我的初步尝试(在下面发布)引发了上面提到的错误:"没有将nil隐式转换为String"引用第5和第9行。
s="helloHELLO"
result=""
vowels=["a","e","i","o","u","A","E","I","O","U"]
string_array=s.split("")
for i in 0..string_array.length
if vowels.include?(string_array[i])
result+= "!"
else
result+=string_array[i]
end
end
puts result
通过实验,我设法让它运转起来;我决定 - 通过打印到屏幕而不是存储在"结果" - 在将目标字母串联到字符串"结果"期间出现问题。但是为什么" string_array [i]" (第9行)被视为NIL而不是字符串?我觉得我错过了一些非常明显的东西。
如果重要的话:这只是CodeWars上的一个问题,它引出了一个关于数据类型和for..in循环机制的基本问题。这似乎非常相关,但对我的问题不是100%的标记:"for" vs "each" in Ruby。
提前感谢您的帮助。
编辑:
好的,我想我明白了。我仍然喜欢一些答案,以确认,澄清或彻底驳斥。
我意识到如果我想使用for循环,我应该将数组本身用作"范围"而不是" 0..array.length",就像这样:
s="helloHELLO"
result=""
vowels=["a","e","i","o","u","A","E","I","O","U"]
string_array=s.split("")
for i in string_array
if vowels.include?(i)
result+= "!"
else
result+=i
end
end
puts result
那么,是因为"每个"方法变量(在这种情况下," i")不存在于主块的范围之外,在评估它是否包含在元音中后,其数据类型变为零#39;阵列
答案 0 :(得分:0)
您的for
循环:
for i in 0..string_array.length
从0到10循环。
但string[10] #=> nil
因为索引10处没有元素。然后在第9行,您尝试将nil
添加到result
result = result + string_array[i] #expanded
您无法将nil
添加到这样的字符串中,您必须明确地将nil
转换为字符串,从而导致错误。解决此问题的最佳方法是将for循环更改为:
for i in 0..string_array.length-1
然后你的循环将在最后一个元素string[9]
完成。
答案 1 :(得分:0)
在迭代以索引0开头的数组时,你遇到了经典错误,而不是长度作为结束位置,它应该是长度为1。 但似乎你来自其他一些编程语言,你的代码不是Rubyesque,而是' For'例如很少使用。 Ruby是一种比大多数其他语言更高的语言,它有许多解决方案,我们称之为“糖”和“糖”。因为Ruby旨在让程序员高兴。您尝试实现的目标只需一行即可完成。
"helloHELLO".scan(/[aeoui]/i).count
一些解释:文字数组"你好HELLO"是一个String,意思是String类的一个对象,因此有许多方法可以使用,比如scan,它扫描字符串中的正则表达式/ [aeoui] /,这意味着[]中包含的任何字符,最后的i使它成为一个案例,所以你不必添加AEOUI。扫描返回一个带有匹配字符的数组,Array类的一个对象有方法计数,它给了我们...是的,一旦你得到漂移它很容易,你可以串联起来对每个方法起作用的方法其他