最好的模式,以平等比较字符串/符号的平等?

时间:2014-07-25 17:35:49

标签: ruby-on-rails ruby

是否有惯用的Ruby模式来测试两个'字符串'对于操作数是字符串还是符号无关紧要的等式?

我想使用一些运算符来执行此比较::abc == 'abc'.to_sym,而无需将操作数标准化为字符串或符号。

HashWithIndifferentAccess中的active_support行为对于我正在寻找的事情来说是非常有用的类比。

5 个答案:

答案 0 :(得分:4)

如果你想在任何地方修补通用功能。

class Object
  def to_s_equals? var
    self.to_s == var
  end
end 

如上所述,除非您后续使用符号,否则只将符号转换为字符串,而不是将符号转换为符号。您可能更具体,只能在Symbol

上执行此操作

或者你可以为String和Symbols添加一些内容,但我想不出一个好的通用名称。

class Symbol
  def equals_string? var
    self.to_s == var
  end
end 

class String
  def equals_symbol? var
    self == var.to_s
  end
end

即便如此equals也不太正确,但match推断正则表达式。可能homologous? (在结构上对应,但不一定是功能)

我不认为你在to_s ==上的简洁性。也许有点清晰,强制执行比较的顺序。

答案 1 :(得分:3)

您可以使用正则表达式模式进行此比较: -

/\Aabc\z/ === "abc" # => true
/\Aabc\z/ === :abc # => true

所以,你可以制作自己的方法: -

def comparisons(sym, str, patt)
   [sym, str].all? { |i| patt === i }
end
comparisons(:abc, "abc", /\Aabc\z/) # => true
comparisons(:abc, "abcd", /\Aabc\z/) # => false
comparisons(:abcd, "abc", /\Aabc\z/) # => false

答案 2 :(得分:1)

HashWithIndifferentAccess显式测试is_a?(Symbol),如果是,则将其转换为字符串。

旁注,将符号转换为字符串可能比其他方向更好。字符串需要清理,而符号则不然,因此符号将永远挂起并慢慢泄漏内存。

答案 3 :(得分:0)

如果您知道该符号将始终用作接收器,您也可以修补Symbol。如

 class Symbol
    alias_method :old_match, :=~
    def =~(s)
      old_match(s.is_a?(String) ? /#{Regexp.quote(s)}/ : s)
    end
 end

 :abc =~ "abc"
 #=> 0
 :abc =~ /abc/
 #=> 0
 :abc =~ "abcd"
 #=> nil

这与:abc =~当前有效的方式完全相同,但首先将String转换为Regex

虽然我一般建议不要在类中构建猴子补丁,除非实施是孤立的,否则不应该有太多可预见的副作用

答案 4 :(得分:0)

从Ruby 2.4开始,您可以使用// ... .target(name: "Common", dependencies: ["App"], path: "Tests/Common"), .testTarget(name: "AppTests", dependencies: ["App", "Common"]), .testTarget(name: "IntegrationTests", dependencies: ["App", "Common"]) // ... 方法

match?