【问题标题】:undefined method `[]' for nil:NilClass when trying to access items in an array尝试访问数组中的项目时,nil:NilClass 的未定义方法“[]”
【发布时间】:2016-07-08 17:38:37
【问题描述】:

我无法访问此数组中的项目,我不知道为什么。

我正在使用一个名为 FastImage 的 Gem,它获取图像 URL 并返回其属性以抓取网页并返回它找到的所有图像的宽度和高度。

- url = open("http://google.com/").read

- imgs = URI.extract(url).select{|img| img[/\.(?:png|jpe?g)\b/]}.each do |img|  
  = FastImage.size(img)

这会打印每个相应数组中的维度,但尝试使用 [] 通过索引访问项目会返回上述错误。

【问题讨论】:

  • 如果这会打印尺寸,那么它显然不会在此处引发错误(尽管您的代码中存在使其无法打印尺寸的漏洞,因为并非所有选定的东西实际上都是图像名称)。请显示代码的哪一部分引发了错误。
  • 它并不专门抓取图像标签,这不是我担心的。像这样在数组末尾添加索引:[0] 会导致错误。
  • 如何一样添加它?你的解释不清楚。
  • [0] 本身不是索引,它是一个单元素列表。请显示生成错误的完整代码。你要在[0] 后面附加什么?
  • 如果您尝试访问FastImage.size(img)[0],那么您当然会收到错误消息。 “它并不专门抓取图像标签,这不是我担心的。” - 你应该是:对于每个非图像,FastImage.size 返回nil,而nil[0] 是一个错误。

标签: ruby-on-rails arrays ruby indexing rubygems


【解决方案1】:

如果img不是图片的有效URL,FastImage.size(img)返回nilFastImage.size(img)[0] 会抛出错误。

如果你使用的是 Ruby 2.3,你可以写 FastImage.size(img)&.[](0),但它很难看。对于任何 Ruby,您都可以这样做:

= size = FastImage.size(img) and size[0]

在任何一种情况下,更好的正则表达式都应该减少误报,从而减少不必要的 HTTP 请求。一件简单的事情可能是将\b 替换为$,因为扩展名实际上应该是URL 中的最后一件事(除非你有奇怪的缓存破坏URL,如foo.jpeg?q=276747622)。

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多