class RuboCop::Cop::Style::CollectionMethods

Enforces the use of consistent method names from the Enumerable module.

You can customize the mapping from undesired method to desired method.

e.g. to use `detect` over `find`:

Style/CollectionMethods:
  PreferredMethods:
    find: detect

@safety

This cop is unsafe because it finds methods by name, without actually
being able to determine if the receiver is an Enumerable or not, so
this cop may register false positives.

@example

# These examples are based on the default mapping for `PreferredMethods`.

# bad
items.collect
items.collect!
items.inject
items.detect
items.find_all
items.member?

# good
items.map
items.map!
items.reduce
items.find
items.select
items.include?

Constants

MSG

Public Instance Methods

on_block(node) click to toggle source
# File lib/rubocop/cop/style/collection_methods.rb, line 47
def on_block(node)
  check_method_node(node.send_node)
end
Also aliased as: on_numblock
on_numblock(node)
Alias for: on_block
on_send(node) click to toggle source
# File lib/rubocop/cop/style/collection_methods.rb, line 53
def on_send(node)
  return unless implicit_block?(node)

  check_method_node(node)
end

Private Instance Methods

check_method_node(node) click to toggle source
# File lib/rubocop/cop/style/collection_methods.rb, line 61
def check_method_node(node)
  return unless preferred_methods[node.method_name]

  message = message(node)
  add_offense(node.loc.selector, message: message) do |corrector|
    corrector.replace(node.loc.selector, preferred_method(node.loc.selector.source))
  end
end
implicit_block?(node) click to toggle source
# File lib/rubocop/cop/style/collection_methods.rb, line 70
def implicit_block?(node)
  return false unless node.arguments.any?

  node.last_argument.block_pass_type? ||
    (node.last_argument.sym_type? &&
    methods_accepting_symbol.include?(node.method_name.to_s))
end
message(node) click to toggle source
# File lib/rubocop/cop/style/collection_methods.rb, line 78
def message(node)
  format(MSG, prefer: preferred_method(node.method_name), current: node.method_name)
end
methods_accepting_symbol() click to toggle source

Some enumerable methods accept a bare symbol (ie. not Symbol#to_proc) instead of a block.

# File lib/rubocop/cop/style/collection_methods.rb, line 84
def methods_accepting_symbol
  Array(cop_config['MethodsAcceptingSymbol'])
end