【问题标题】:Datatype conversion error in Ruby for-loopRuby for 循环中的数据类型转换错误
【发布时间】: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


    【解决方案1】:

    在迭代从索引 0 开始的数组时,您被经典错误打败了,而不是长度作为结束位置,它应该是长度为 1。 但似乎您来自其他编程语言,您的代码不是 Rubyesque,例如很少使用“For”。 Ruby 是一种比大多数其他语言更高级的语言,它内置了许多解决方案,我们称它为“糖”,因为 Ruby 旨在让我们的程序员开心。您尝试实现的目标只需一行即可完成。

    "helloHELLO".scan(/[aeoui]/i).count
    

    一些解释:文字数组“hello HELLO”是一个String,表示String类的一个对象,因此有很多方法可以使用,比如scan,它扫描字符串中的正则表达式/[aeoui ]/ 表示 [] 中包含的任何字符,末尾的 i 使其不区分大小写,因此您不必添加 AEOUI。扫描返回一个带有匹配字符的数组,Array 类的一个对象具有方法计数,这给了我们......是的,一旦你得到了漂移,这很容易,你可以将相互作用的方法串在一起。

    【讨论】:

      【解决方案2】:

      您的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]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-22
        • 1970-01-01
        • 2012-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多