class RuboCop::Cop::Style::ArrayCoercion
Enforces the use of ‘Array()` instead of explicit `Array` check or `[*var]`.
The cop is disabled by default due to safety concerns.
@safety
This cop is unsafe because a false positive may occur if the argument of `Array()` is (or could be) nil or depending on how the argument is handled by `Array()` (which can be different than just wrapping the argument in an array). For example: [source,ruby] ---- [nil] #=> [nil] Array(nil) #=> [] [{a: 'b'}] #= [{a: 'b'}] Array({a: 'b'}) #=> [[:a, 'b']] [Time.now] #=> [#<Time ...>] Array(Time.now) #=> [14, 16, 14, 16, 9, 2021, 4, 259, true, "EDT"] ----
@example
# bad paths = [paths] unless paths.is_a?(Array) paths.each { |path| do_something(path) } # bad (always creates a new Array instance) [*paths].each { |path| do_something(path) } # good (and a bit more readable) Array(paths).each { |path| do_something(path) }
Constants
- CHECK_MSG
- SPLAT_MSG
Public Instance Methods
Source
# File lib/rubocop/cop/style/array_coercion.rb, line 63 def on_array(node) return unless node.square_brackets? array_splat?(node) do |arg_node| message = format(SPLAT_MSG, arg: arg_node.source) add_offense(node, message: message) do |corrector| corrector.replace(node, "Array(#{arg_node.source})") end end end
Source
# File lib/rubocop/cop/style/array_coercion.rb, line 74 def on_if(node) unless_array?(node) do |var_a, var_b, var_c| if var_a == var_b && var_c == var_b message = format(CHECK_MSG, arg: var_a) add_offense(node, message: message) do |corrector| corrector.replace(node, "#{var_a} = Array(#{var_a})") end end end end