123456789_123456789_123456789_123456789_123456789_

Class: RuboCop::Cop::Performance::ArraySemiInfiniteRangeSlice

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, TargetRubyVersion, AutoCorrector, Base
Instance Chain:
self, RangeHelp, Base
Inherits: Base
  • Object
Defined in: lib/rubocop/cop/performance/array_semi_infinite_range_slice.rb

Overview

Identifies places where slicing arrays with semi-infinite ranges can be replaced by Array#take and Array#drop. This cop was created due to a mistake in microbenchmark and hence is disabled by default. Refer https://github.com/rubocop/rubocop-performance/pull/175#issuecomment-731892717

Examples:

# bad
array[..2]
array[...2]
array[2..]
array[2...]
array.slice(..2)

# good
array.take(3)
array.take(2)
array.drop(2)
array.drop(2)
array.take(3)

Cop Safety Information:

  • This cop is unsafe for string slices because strings do not have #take and #drop methods.

Constant Summary

Instance Method Summary

Instance Method Details

#correction(receiver, range_node) (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/performance/array_semi_infinite_range_slice.rb', line 66

def correction(receiver, range_node)
  method_call = if range_node.begin
                  "drop(#{range_node.begin.value})"
                elsif range_node.irange_type?
                  "take(#{range_node.end.value + 1})"
                else
                  "take(#{range_node.end.value})"
                end

  "#{receiver.source}.#{method_call}"
end

#on_csend(node)

Alias for #on_send.

[ GitHub ]

  
# File 'lib/rubocop/cop/performance/array_semi_infinite_range_slice.rb', line 62

alias on_csend on_send

#on_send(node) Also known as: #on_csend

[ GitHub ]

  
# File 'lib/rubocop/cop/performance/array_semi_infinite_range_slice.rb', line 52

def on_send(node)
  endless_range_slice?(node) do |receiver, method_name, range_node|
    prefer = range_node.begin ? :drop : :take
    message = format(MSG, prefer: prefer, current: method_name)

    add_offense(node, message: message) do |corrector|
      corrector.replace(node, correction(receiver, range_node))
    end
  end
end