Когда ничего не помогает, запустите несколько тестов:
str = 'string'
s = 'string'
r = /string/
methods = {
:equals_or_matches => lambda { |t| str == t || str =~ t },
:square_brackets => lambda { |t| str[t] == str }
}
methods.each_pair do |name, method|
puts name
[s, r].each do |t|
puts t.class
5.times do
start = Time.now
1000000.times do
method.call(t)
end
puts Time.now - start
end
end
puts
end
Я получил эти результаты:
equals_or_matches
String
0.942799
0.942405
0.944376
0.946296
0.93843
Regexp
1.916263
1.915058
1.913306
1.934423
1.932633
square_brackets
String
1.15087
1.157245
1.157863
1.174356
1.188758
Regexp
2.09721
2.103493
2.028035
2.025194
2.037734
Это означает, что ваш первый метод немного быстрее, чем второй.
Однако, , если строки не равны, а ||
не "закорачивается", вы получите TypeError
. Вы не можете передать строку в =~
. Так что вы, вероятно, должны заменить это на str.match(t)
, что дало мне следующие результаты:
equals_or_matches
String
0.936063
0.94154
0.938561
0.934187
0.935868
Regexp
2.755815
2.75011
2.758374
2.761684
2.76826
square_brackets
String
1.198433
1.160929
1.354407
1.410265
1.274158
Regexp
2.013017
2.275579
2.297108
2.165399
2.125889
В этом случае ваш первый метод оказался намного хуже для регулярных выражений, но второй был примерно таким же.
Как я уже сказал, просто запустите некоторые тесты на реальных данных и посмотрите, что произойдет.