class RuboCop::Cop::Performance::CompareWithBlock
array.min_by(&:foo)
array.max_by(&:foo)
end
var.foo
array.sort_by do |var|
array.sort_by { |v| v.foo }
array.sort_by(&:foo)
@good
array.min { |a, b| a.foo <=> b.foo }
array.max { |a, b| a.foo <=> b.foo }
array.sort { |a, b| a.foo <=> b.foo }
@bad
@example
This cop also checks ‘max` and `min` methods.
can be replaced by `sort_by(&:foo)`.
This cop identifies places where `sort { |a, b| a.foo <=> b.foo }`
def autocorrect(node)
def autocorrect(node) send, = *node lambda do |corrector| method = node.children.last.children.last.children.last corrector.replace(compare_range(send, node), "#{send.method_name}_by(&:#{method})") end end
def compare_range(send, node)
def compare_range(send, node) range_between(send.loc.selector.begin_pos, node.loc.end.end_pos) end
def on_block(node)
def on_block(node) compare?(node) do |send, var_a, var_b, method| range = compare_range(send, node) compare_method = send.method_name add_offense(node, range, format(MSG, compare_method, method, compare_method, var_a, var_b, var_a, method, var_b, method)) end end