Ruby中类似于String.equalsIgnoreCase(...)的方法是什么?

7

我希望以不区分大小写的方式在 Ruby 中测试 2 个字符串是否相等。

在一些语言中,比如 Fantom,你可以使用下面的代码:

string1.equalsIgnoreCase(string2)

在 Ruby 中,什么是惯用的方法?

4个回答

16

你可以使用casecmp

"Test".casecmp("teST")
=> 0

"Test".casecmp("teST2")
=> -1

因此,如果要测试相等性,您可以执行以下操作:

if str.casecmp(str2).zero?
  # strings are equal
end

1
你可以在末尾添加“.zero?”。 - Michael Kohl
我喜欢.zero?的添加,以前我从未遇到过这个。 - Steve Eynon
Fixnum#nonzero?Fixnum#zero?是避免在if条件中使用0的惯用方式,因为在这种情况下,0值被认为是true。 - SirDarius
3
“‘casecmp’肯定意味着大小写很重要。这不应该被称为‘nocasecmp’吗? :)” - android.weasel

4

虽然有 casecmp 方法:

0 == s1.casecmp(s2) # strings equal

我个人更喜欢
s1.downcase == s2.downcase

1
您的首选方式并不等同。 :) - Sergio Tulentsev
@SergioTulentsev 呃,周围建议使用 String#match 的用途。与那些相比,我的方法是一个鲜明的等价物 :-) - Aleksei Matiushkin
我的意思是“downcase”方法。它不适用于签名s1.op(s2)。无论如何,没关系。 :) - Sergio Tulentsev
我认为这段代码的意图比被采纳的答案中的casecmp方法清晰得多。 - SDJMcHattie
当然是这样,这也是我更喜欢它的原因。 - Aleksei Matiushkin

1
你可以将字符串转换为小写,然后进行比较。
a.downcase == b.downcase

或者,如果你喜欢,将其转换为大写。
a.upcase == b.upcase

1
虽然这个解决方案很明显,但为了进行简单的比较而转换两个对象...对我来说似乎有点过头了。 - Steve Eynon

1
你可以使用 String#match 方法:
s = "Test"
s.match(/teST/i) # => #<MatchData "Test">
s.match(/teST2/i) # => nil

在Ruby中,除了 nilfalse 以外的所有对象都具有真值。因此,您也可以使用这个技巧来进行条件测试。请记住保留html标签。

这个解决方案是迄今为止最易读和非常明确的。但我只是觉得它不是符合“Ruby”的惯用方式... - Steve Eynon
@SteveEynon 我使用这种技术,因为它非常基础和易于使用。 :) - Arup Rakshit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接