【问题标题】:Ruby - Runtime error in for loopRuby - for 循环中的运行时错误
【发布时间】:2016-06-18 12:14:58
【问题描述】:

我有一个 for 循环,可以显示存储在数组中的许多哈希值,但只显示与 :features 键关联的哈希值。

我尝试在 ideone.com 中运行代码,for 循环正常工作并打印出我想要的输出,但在第一行显示错误。

#output
Runtime error   time: 0.06 memory: 9712 signal:-1
[0.25, 0.1, 5]
[0.3, 0.14, 7]
[0.2, 0.17, 6]
[0.4, 0.12, 8]
[0.1, 0.11, 3]

这是我的代码

data_point_a = {:label => "cat", :features => [0.25,0.1,5]}
data_point_b = {:label => "dog", :features => [0.3,0.14,7]}
data_point_c = {:label => "dog", :features => [0.2,0.17,6]}
data_point_d = {:label => "dog", :features => [0.4,0.12,8]}
data_point_e = {:label => "cat", :features => [0.1,0.11,3]}
data_point_f = {:label => "unknown", :features => [0.8,0.3,4]}
#data point f is not part of the array
list = [data_point_a, data_point_b,data_point_c,data_point_d,data_point_e]

for index in 0..list.length
    puts "#{list[index][:features]}"
end

【问题讨论】:

  • 你的问题是什么?
  • 我认为这个错误实际上是与在ideone.com中运行有关,而不是ruby代码本身?

标签: ruby loops for-loop


【解决方案1】:

您忘记查看stderr 输出:

prog.rb:11:in `block in <main>': undefined method `[]' for nil:NilClass (NoMethodError)
    from prog.rb:10:in `each'
    from prog.rb:10:in `<main>'

问题是您的循环从0 运行到list.length,但list 的最后一个有效索引是list.length - 1。这应该有效:

for index in 0..(list.length - 1)
    puts "#{list[index][:features]}"
end

更惯用的方法是使用.each

list.each do |item|
  puts "#{item[:features]}"
end

【讨论】:

  • 使用#each确实是一个不错的选择。我不记得上次在 Ruby 中使用 for 循环是什么时候了。
【解决方案2】:

我认为它将是 ... 而不是 .. 因为放置 ... 将排除最后一个实际上是 nil 的索引

 for index in 0...list.length
     puts "#{list[index][:features]}"
 end

【讨论】:

    【解决方案3】:
    (0..3).to_a     #=> [0,1,2,3]
    (0...3).to_a    #=> [0,1,2]
    

    for 循环中的最后一个 index 超出范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2021-04-04
      • 2023-03-05
      相关资源
      最近更新 更多