【问题标题】:Getting "NoMethodError" when trying to sort my Ruby array尝试对我的 Ruby 数组进行排序时出现“NoMethodError”
【发布时间】:2017-01-17 18:50:27
【问题描述】:

我使用的是 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>'

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

【问题讨论】:

    标签: arrays ruby sorting field


    【解决方案1】:

    尝试其中一种

    results.sort_by(&:time_in_ms)
    

    长格式的

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

    sort 方法期望块返回一个整数值而不是布尔值。您收到此错误是因为您的块返回一个布尔值。

    引用ri 文档

    返回一个数组,其中包含枚举中的项目,根据它们自己的&lt;=&gt; 方法或使用提供的块的结果进行排序。该块应返回 -10+1,具体取决于 a 和 b 之间的比较。

    【讨论】:

      【解决方案2】:

      试试这个

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-17
        • 2020-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多