为什么我会在评估nil时发生错误。< =>“什么时候使用sort_by?

时间:2010-12-07 19:32:35

标签: ruby sorting enumerable

这是代码:

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.<=>

3 个答案:

答案 0 :(得分:3)

最后一行不应该是

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

不是@contacts[0].size

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

答案 1 :(得分:3)

尝试使用:

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

而不是:

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

答案 2 :(得分:0)

我认为您可以简化您的代码:

@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']为空,您将收到您所看到的错误,因此您需要跳过这些元素或使用名称字段的默认值,例如“unknown”。