【问题标题】:Why do I get "The error occurred while evaluating nil.<=>" when using sort_by?为什么在使用 sort_by 时出现“评估 nil 时发生错误。<=>”?
【发布时间】:2011-05-21 19:33:31
【问题描述】:

这是代码:

xml = REXML::Document.new(data)
  @contacts = Array.new
  xml.elements.each('//entry') do |entry|
    person = {}
    person['name'] = entry.elements['title'].text

    gd_email = entry.elements['gd:email']
    person['email'] = gd_email.attributes['address'] if gd_email

    @contacts << person
  end

  @contacts.sort_by { |k| k['name'] } if @contacts[0].size > 0

错误:

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.<=>

【问题讨论】:

    标签: ruby sorting enumerable


    【解决方案1】:

    我认为您可以稍微简化一下代码:

    @contacts = Array.new
    xml = REXML::Document.new(data)
    xml.elements.each('//entry') do |entry|
      gd_email = entry.elements['gd:email']
    
      @contacts << {
        'name'  => entry.elements['title'].text,
        'email' => (gd_email) ? gd_email.attributes['address'] : '' 
      }
    end
    
    @contacts.sort_by! { |k| k['name'] }
    

    我没有你的 XML 样本来测试它,但它看起来应该可以工作。

    如果 element['title'] 为 null,您将收到您所看到的错误,因此您需要跳过这些元素或使用名称字段的默认值,例如“未知”。

    【讨论】:

      【解决方案2】:

      尝试使用:

      person['name'] = entry.elements['title'].text || ''
      

      代替:

      person['name'] = entry.elements['title'].text
      

      【讨论】:

      • @rtacconi #sort_by 不对数组进行就地排序,而是返回一个已排序的新数组。也许你的意思是@contacts = @contacts.sort_by...
      • 是的,一般情况下,您需要在array methods 后加一个“!”让他们修改当前数组。
      【解决方案3】:

      最后一行不应该是

      @contacts.sort_by { |k| k['name'] } if @contacts.size > 0
      

      不是@contacts[0].size

      另外,请尝试在排序前添加@contacts.compact!,以确保数组中没有nil 值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-01
        • 1970-01-01
        • 2011-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多