【问题标题】:Ruby for loop gives Nil class error when assigning array valuesRuby for 循环在分配数组值时给出 Nil 类错误
【发布时间】:2013-06-05 20:10:03
【问题描述】:

我有问题。我正在为 Google Sketchup 编写一个插件,我正在尝试过滤掉数组值并将过滤后的值放入另一个数组中。这样做是这样的:

for z in 0..points.length
  points2[z]=points[z][1]
end

其中“points”是一个双精度数组。谁能告诉我我做错了什么?

【问题讨论】:

  • 能否提供更详细的日志?

标签: ruby arrays loops for-loop


【解决方案1】:

这样应该会更好:

points2 = points.map {|p| p[1]}

【讨论】:

  • @Jakcson'sMom tlewin 的代码与您的代码执行相同的操作:对于 points 的每个(数组)元素,将该数组的第二个值分配给 points2 中的相应位置。除了你超出了points 的结尾,这不会。也许这就是你寻求帮助的原因?你没有说清楚哪里出了问题。
  • 我猜,如果是Nil类错误,他没有初始化points2变量。上面的办法,没必要。
  • 是的,您修复了索引超过points 末尾的明确错误以及可能无法初始化points2 的错误。而且它更全面,因为它更像 Ruby,更清晰,更不容易出错,并且没有需要初始化points2
  • 为了记录,我出于所有这些原因对您的答案投了赞成票,但是如果您将这些原因包含在您的答案中,您的答案会更好,而不是只是说“这应该更好”。
  • @DarshanComputing 你是对的!当我看到你的评论时,我意识到了。谢谢!
【解决方案2】:

你做错了什么是循环一次。使用虚假数据:

ar = [1,2,3]
ar2 = []
for z in 0..ar.length 
#off by one! Should be one less. But then you should test for empty arrays...
  ar2[z] = ar[z]
end
p ar2 #[1, 2, 3, nil]

其他答案提倡map,他们是对的,但是您可以将 for 循环转换为更不容易出错的循环:

for z in ar
  ar2 << z
end

【讨论】:

    【解决方案3】:

    你做错了什么?我是for 循环的粉丝,你应该使用函数式风格,又名。红宝石方式:

    points2 = points.map { |element| element[1] }
    

    否则,如果您希望人们诊断您的 for 循环,则必须发布更好的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多