是否有惯用的Ruby模式来测试两个'字符串'对于操作数是字符串还是符号无关紧要的等式?
我想使用一些运算符来执行此比较::abc == 'abc'.to_sym
,而无需将操作数标准化为字符串或符号。
HashWithIndifferentAccess
中的active_support
行为对于我正在寻找的事情来说是非常有用的类比。
答案 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?