【问题标题】:No implicit conversion from nil to integer没有从零到整数的隐式转换
【发布时间】:2012-09-11 02:22:08
【问题描述】:

我有一个通过获取 html 并使用 split 函数创建的字符串数组。我正在尝试遍历它:

html_array.each do |line|
    ...
end

我可以puts 使用puts line.index('text') 在每个line 中的字符串的索引,并且我可以puts 使用puts line[17] 的索引处的字符(两者都不打印nil),但是当我结合像

这样的二合一命令
puts line[line.index('text')]

它给了我错误:

no implicit conversion from nil to integer (TypeError)

谁能告诉我我做错了什么?顺便说一句,我是编程和 ruby​​ 新手。

【问题讨论】:

  • 使用p,而不是putshtml_array.each { |line| p line.index 'text' } 你可能有不匹配的行。您也不应该使用 split 函数解析 HTML。请改用Nokogiri

标签: ruby implicit-conversion


【解决方案1】:

line.index('text') 在某些时候返回nil,因为在该行中找不到字符串“text”。然后您尝试访问line[nil],这是一个无效的数组索引。

这样的东西可能会更好:

index = line.index('text')
if index.nil?
  puts "Text not found"
else
  puts line[index]
end

这将在尝试使用它之前检查字符串的索引是否为 nil(如果该行不包含该字符串,则会提醒您)。

【讨论】:

  • 我让它与基本相同的东西一起工作: puts line[line.index("text")] if line.index("text")
【解决方案2】:

只是为了追踪您的某些行是否有错误,请尝试:

html_array.each do |line|
  puts (line[line.index('text')] rescue "nil")
end

每有错误的行都会打印一个“nil”。我怀疑“文本”不会出现在每一行中。您能否分享一下您正在努力实现的目标?

【讨论】:

  • "text" 实际上并没有出现在每一行中。除了第一个之外,所有这些都存在,但一开始我并没有意识到这一点。使用 rescure 不起作用,但我让它与 puts line[line.index("text")] if line.index("text") 一起工作
【解决方案3】:

你可以像下面这样轻松地做到这一点:

   html_array.each do |line|
        if line.index("Text").present?
          puts line[line.index("Text")]
        end
    end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2017-01-19
    相关资源
    最近更新 更多