class RuboCop::Cop::Style::ArrayIntersect
In Ruby 3.1, ‘Array#intersect?` has been added.
This cop identifies places where ‘(array1 & array2).any?` can be replaced by `array1.intersect?(array2)`.
The ‘array1.intersect?(array2)` method is faster than `(array1 & array2).any?` and is more readable.
In cases like the following, compatibility is not ensured, so it will not be detected when using block argument.
- source,ruby
([1] & [1,2]).any? { |x| false } # => false [1].intersect?() { |x| false } # => true
@safety
This cop cannot guarantee that `array1` and `array2` are actually arrays while method `intersect?` is for arrays only.
@example
# bad (array1 & array2).any? (array1 & array2).empty? # good array1.intersect?(array2) !array1.intersect?(array2)
@example AllCops:ActiveSupportExtensionsEnabled: false (default)
# good (array1 & array2).present? (array1 & array2).blank?
@example AllCops:ActiveSupportExtensionsEnabled: true
# bad (array1 & array2).present? (array1 & array2).blank? # good array1.intersect?(array2) !array1.intersect?(array2)
Constants
- MSG
- NEGATED_METHODS
- RESTRICT_ON_SEND
- STRAIGHT_METHODS
Public Instance Methods
on_send(node)
click to toggle source
# File lib/rubocop/cop/style/array_intersect.rb, line 79 def on_send(node) return if (parent = node.parent) && (parent.block_type? || parent.numblock_type?) return unless (receiver, argument, method_name = bad_intersection_check?(node)) message = message(receiver.source, argument.source, method_name) add_offense(node, message: message) do |corrector| bang = straight?(method_name) ? '' : '!' corrector.replace(node, "#{bang}#{receiver.source}.intersect?(#{argument.source})") end end
Private Instance Methods
bad_intersection_check?(node)
click to toggle source
# File lib/rubocop/cop/style/array_intersect.rb, line 94 def bad_intersection_check?(node) if active_support_extensions_enabled? active_support_bad_intersection_check?(node) else regular_bad_intersection_check?(node) end end
message(receiver, argument, method_name)
click to toggle source
# File lib/rubocop/cop/style/array_intersect.rb, line 106 def message(receiver, argument, method_name) negated = straight?(method_name) ? '' : '!' format( MSG, negated: negated, receiver: receiver, argument: argument, method_name: method_name ) end
straight?(method_name)
click to toggle source
# File lib/rubocop/cop/style/array_intersect.rb, line 102 def straight?(method_name) STRAIGHT_METHODS.include?(method_name.to_sym) end