首页 > 解决方案 > 在 ruby​​ 中替换 === (大小写相等运算符)

问题描述

我在做自己的 ruby​​ 枚举时遇到了 rubocop 问题。我使用了 a===并且 rubocop 要求我更改它。但是每次我尝试放置不同的东西时,我的方法都会停止按预期工作。

module Enumerable
  def my_all?(arg = nil)
    return true if !block_given? && include?(nil) == false && include?(false) == false && arg.nil?
    return false unless block_given? || arg.nil? == false || empty?
    
    if block_given?
      my_each do |x|
        return false unless yield(x)
      end
    elsif arg.class == Regexp
      my_each do |x|
        return false unless x.match(arg)
      end
    elsif arg.class == Numeric
      my_each do |x|
        return false unless x.is_a? arg
      end
    else
      my_each do |x|
        return false unless arg === x
      end
    end
    true
  end
end

最后===一点是提供改变的阻力。感谢那些能够理解这一点并提供帮助的人!

标签: ruby

解决方案


文档Enumerable#all?专门说,当给出模式时:

[...]该方法返回是否pattern === element为每个集合成员。

因此,为了复制您实际必须调用的方法===。仅仅为了取悦 Rubocop 而尝试替换它可能会导致不同的行为。

在你的情况下,我会使用内联评论禁用警察:

my_each do |x|
  return false unless arg === x # rubocop:disable Style/CaseEquality
end

推荐阅读