class RuboCop::Cop::Performance::TimesMap

This cop checks for .times.map calls. In most cases such calls can be replaced with an explicit array creation.

@example

# bad
9.times.map do |i|
  i.to_s
end

# good
Array.new(9) do |i|
  i.to_s
end

Constants

MESSAGE
MESSAGE_ONLY_IF
RESTRICT_ON_SEND

Public Instance Methods

on_block(node) click to toggle source
# File lib/rubocop/cop/performance/times_map.rb, line 32
def on_block(node)
  check(node)
end
on_send(node) click to toggle source
# File lib/rubocop/cop/performance/times_map.rb, line 28
def on_send(node)
  check(node)
end

Private Instance Methods

check(node) click to toggle source
# File lib/rubocop/cop/performance/times_map.rb, line 38
def check(node)
  times_map_call(node) do |map_or_collect, count|
    add_offense(node, message: message(map_or_collect, count)) do |corrector|
      replacement = "Array.new(#{count.source}" \
                    "#{map_or_collect.arguments.map { |arg| ", #{arg.source}" }.join})"

      corrector.replace(map_or_collect.loc.expression, replacement)
    end
  end
end
message(map_or_collect, count) click to toggle source
# File lib/rubocop/cop/performance/times_map.rb, line 49
def message(map_or_collect, count)
  template = if count.literal?
               "#{MESSAGE}."
             else
               "#{MESSAGE} #{MESSAGE_ONLY_IF}."
             end
  format(template, count: count.source, map_or_collect: map_or_collect.method_name)
end