Какой из них лучше? На этот вопрос нелегко ответить, потому что они не все делают одно и то же.
x == 'abc' || x == 'def' || x == 'ghi'
%w(abc def ghi).include? x
сравнить x
с фиксированными строками на равенство. x
должно быть одним из этих значений. Между этими двумя я склоняюсь ко второму, потому что его легче поддерживать. Представьте, как бы это выглядело, если бы вам пришлось сравнивать двадцать, пятьдесят или сто строк.
Третий тест:
x ~= /abc|def|ghi/
соответствует подстроке:
x = 'xyzghi'
(x =~ /abc|def|ghi/) # => 3
так что это не то же самое, что первые два.
РЕДАКТИРОВАТЬ: Есть некоторые вещи в тестах, сделанные Nash, что я бы сделал по-другому. Используя Ruby 1.9.2-p180 на MacBook Pro, он проверяет 1 000 000 циклов и сравнивает результаты привязки регулярного выражения, используя группировку и не разделяя массив %w()
каждый раз по циклу:
require 'benchmark'
str = "test"
n = 1_000_000
Benchmark.bm do |x|
x.report { n.times { str == 'abc' || str == 'def' || str == 'ghi' } }
x.report { n.times { %w(abc def ghi).include? str } }
x.report { ary = %w(abc def ghi); n.times { ary.include? str } }
x.report { n.times { str =~ /abc|def|ghi/ } }
x.report { n.times { str =~ /^abc|def|ghi$/ } }
x.report { n.times { str =~ /^(abc|def|ghi)$/ } }
x.report { n.times { str =~ /^(?:abc|def|ghi)$/ } }
x.report { n.times { str =~ /\b(?:abc|def|ghi)\b/ } }
end
# >> user system total real
# >> 1.160000 0.000000 1.160000 ( 1.165331)
# >> 1.920000 0.000000 1.920000 ( 1.920120)
# >> 0.990000 0.000000 0.990000 ( 0.983921)
# >> 1.070000 0.000000 1.070000 ( 1.068140)
# >> 1.050000 0.010000 1.060000 ( 1.054852)
# >> 1.060000 0.000000 1.060000 ( 1.063909)
# >> 1.060000 0.000000 1.060000 ( 1.050813)
# >> 1.050000 0.000000 1.050000 ( 1.056147)