尝试对我的 Ruby 数组进行排序时得到 "NoMethodError"

Getting "NoMethodError" when trying to sort my Ruby array

我正在使用 Ruby 2.4。我很难根据存储在该数组中的对象的特定字段对数组进行排序。我有

    results.sort! { |a,b| 
      puts "a time: #{a.time_in_ms} b time: #{b.time_in_ms}" 
      a.time_in_ms < b.time_in_ms
    }

虽然我已经在我的 rails 控制台中验证了两个字段都是整数,但是当我 运行 这段代码时我得到了一个“”错误 ...

a time: 16968700 b time: 21784000 
NoMethodError: undefined method `>' for true:TrueClass
    from /Users/davea/Documents/workspace/myproject/app/services/text_table_to_race_time_converter_service.rb:668:in `sort'
    from /Users/davea/Documents/workspace/myproject/app/services/text_table_to_race_time_converter_service.rb:668:in `populate_overall_rank_info'
    from /Users/davea/Documents/workspace/myproject/app/services/text_table_to_race_time_converter_service.rb:408:in `get_data_hash'
    from /Users/davea/Documents/workspace/myproject/app/services/text_table_to_race_time_converter_service.rb:25:in `get_race_times'
    from /Users/davea/Documents/workspace/myproject/app/services/active_com_service.rb:57:in `process_page_data'
    from /Users/davea/Documents/workspace/myproject/app/services/abstract_import_service.rb:88:in `process_race_data'
    from (irb):2
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/console.rb:65:in `start'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/console_helper.rb:9:in `start'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:78:in `console'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands.rb:18:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

如何根据对象中的字段进行排序?

试试这个

 results.sort_by! { |element| element.time_in_ms }

尝试其中之一

results.sort_by(&:time_in_ms)

属于long-form

results.sort { |a, b| a.time_in_ms <=> b.time_in_ms }

sort 方法要求块 return 一个整数值而不是布尔值。您收到此错误是因为您的块 return 是布尔值。

引用自 ri 文档

Returns an array containing the items in enum sorted, either according to their own <=> method, or by using the results of the supplied block. The block should return -1, 0, or +1 depending on the comparison between a and b.