尝试对我的 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.
我正在使用 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.