Ruby for循环中的数据类型转换错误

时间:2016-12-11 00:02:34

标签: ruby for-loop each type-conversion

我正在寻找一些帮助,以便在尝试使用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;阵列

2 个答案:

答案 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类的一个对象有方法计数,它给了我们...是的,一旦你得到漂移它很容易,你可以串联起来对每个方法起作用的方法其他