Відповіді:
Ви шукаєте casecmp
. Він повертається, 0
якщо два рядки рівні, без регістру.
str1.casecmp(str2) == 0
"Apple".casecmp("APPLE") == 0
#=> true
Крім того, ви можете перетворити обидва рядки в малі регістри ( str.downcase
) і порівняти для рівності.
casecmp
: Дурне назву для прецедентного в , чутливого порівняти метод?!
== 0
зzero?
"Apple".casecmp("APPLE").zero?
але особисто мені подобається відповідь Андреса нижче, яка використовує.casecmp?
У Ruby 2.4.0 ви маєте:casecmp?(other_str) → true, false, or nil
"abcdef".casecmp?("abcde") #=> false
"aBcDeF".casecmp?("abcdef") #=> true
"abcdef".casecmp?("abcdefg") #=> false
"abcdef".casecmp?("ABCDEF") #=> true
casecmp
мотлохом.
"aBcDeF".downcase == "abcdef"
натомість. Набагато більш читабельні та підвищення продуктивності від використання casecmp
усуваються в Ruby 2.4+.
false
і nil
для API , як це ...
Якщо вам доведеться порівняти рядки UTF-8, ігноруючи регістр:
>> str1 = "Мария"
=> "Мария"
>> str2 = "мария"
=> "мария"
>> str1.casecmp(str2) == 0
=> false
>> require 'active_support/all'
=> true
>> str1.mb_chars.downcase.to_s.casecmp(str2.mb_chars.downcase.to_s) == 0
=> true
Це працює в Ruby 2.3.1 і більш ранніх версіях.
Для меншої площі пам’яті ви можете вибрати вишню string/multibyte
:
require 'active_support'
require 'active_support/core_ext/string/multibyte'
Редагувати , Ruby 2.4.0:
>> str1.casecmp(str2) == 0
=> false
Так casecmp
не працює в 2.4.0; Однак у версії 2.4.0 можна порівняти рядки UTF-8 вручну без active_support
дорогоцінного каміння:
>> str1.downcase == str2.downcase
=> true
casecmp і нуль? вбудовані методи рубіну. casecmp повертає 0, якщо два рядки рівні, регістр без чутливості та нуль? перевіряє нульове значення (== 0)
str1.casecmp(str2).zero?
0
, особливо, коли вкладено з більш привабливою умовою.
Для ruby 2.4 працює добре casecmp? для рядків utf-8 (mb_chars не потрібні):
2.4.1 :062 > 'строка1'.casecmp?('СтроКа1')
=> true
але casecmp не працює для utf-8:
2.4.1 :062 > 'строка1'.casecmp('СтроКА1')
=> 1
2.4.1 :063 > 'string1'.casecmp('StrInG1')
=> 0