nil的未定义方法'[]':NilClass

时间:2012-09-12 15:31:16

标签: ruby

我正在编写一个快速脚本,通过telnet从CLI中提取设备中的数据。我可以使用一点帮助来解决我不知道如何处理的错误。

res = nil
res = t.cmd('actual command').match(/Calls:\s(\d{1,})/)[1].to_i

在某些情况下,设备会快速打印出各种自主输出。此外,在此期间,设备有时不会返回导致不匹配的所有输出。因此,我收到以下错误:

in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)

我尝试了一些不同的东西,似乎无法解决这个问题。感谢您对此的任何帮助。

2 个答案:

答案 0 :(得分:12)

当您看到undefined method '[]' for nil:NilClass时,它意味着:

  

喂!您的值为nil后跟[...],但nil没有此方法。

在这种情况下,您的问题是match(...)有时无法匹配您想要的文字,返回nil,然后您无法要求[1]。一些避免这种情况的直接方法是:

match = t.cmd('actual command').match(/Calls:\s(\d{1,})/)
res = match && match[1].to_i

# or
res = match[1].to_i if match

# or 
res = if (match=t.cmd('actual command').match(/Calls:\s(\d{1,})/))
  match[1].to_i
end

# or
res = (match=t.cmd('actual command').match(/Calls:\s(\d{1,})/)) && match[1].to_i

但是,更简单的解决方案是使用String#[]方法直接取出正则表达式捕获:

res = t.cmd('actual command')[/Calls:\s(\d+)/,1]
res = res.to_i if res

如果正则表达式失败,此表单会自动返回nil,并且您不想在to_i上致电nil

我还清理了你的正则表达式,因为\d{1,}相当于\d+

答案 1 :(得分:2)

您需要条件来检查匹配结果是否为零。尝试这样的事情:

res = nil
res = t.cmd('actual command').match(/Calls:\s(\d{1,})/)[1].to_i rescue nil

res变量将保持为零,因此您可以稍后使用此信息进行一些检查。