【发布时间】:2017-04-26 04:25:16
【问题描述】:
我正在寻找一些帮助来理解为什么在尝试使用 for 循环搜索字母数组(并将它们添加到结果字符串中)时出现错误(没有将 nil 隐式转换为字符串)似乎是真正的问题),但不是当我出于相同目的使用while循环或“每个”时。我查看了很多文档,但无法找到为什么会发生这种情况的答案。我知道我可以只使用“每个”方法并称之为一天,但我更愿意理解原因和结果(并希望将来避免这个问题)。
以下方法按需要工作:打印原始字符串“result”,仅使用“!”代替任何元音。
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
但是,我最初的尝试(在下面发布)引发了上述错误:引用第 5 行和第 9 行的“没有将 nil 隐式转换为字符串”。
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 上的一个 kata,它让我想到了一个关于数据类型和 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
那么,是不是因为“each”方法变量(在这种情况下,“i”)不存在于主块的范围之外,所以在评估它是否包含在“元音”中之后,它的数据类型变为 nil数组?
【问题讨论】:
标签: ruby for-loop each type-conversion