class RuboCop::Cop::Performance::ArraySemiInfiniteRangeSlice
array.take(3)
array.drop(2)
array.drop(2)
array.take(2)
array.take(3)
# good
array.slice(..2)
array[2…]
array[2..]
array[…2]
array[..2]
# bad
@example
This cop is unsafe for string slices because strings do not have ‘#take` and `#drop` methods.
@safety
Refer github.com/rubocop/rubocop-performance/pull/175#issuecomment-731892717<br>This cop was created due to a mistake in microbenchmark and hence is disabled by default.
can be replaced by `Array#take` and `Array#drop`.
Identifies places where slicing arrays with semi-infinite ranges
def correction(receiver, range_node)
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
def on_send(node)
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