Передать несколько строк в ruby ​​starts_with?

У меня есть этот код

if self.name.starts_with?('Bronze') || self.name.starts_with?('Silver') ||self.name.starts_with?('Gold')

Есть ли способ передать все эти строки за один раз, а не много OR, поскольку мне, возможно, придется расширять это?

Ответ 1

String#start_with? принимает произвольное количество аргументов. Вам не нужно использовать ||.

'Silver medal'.start_with?('Bronze', 'Silver', 'Gold')
# => true
'Hello medal'.start_with?('Bronze', 'Silver', 'Gold')
# => false

Ответ 2

Нет, start_with принимает строку или регулярное выражение.

Я нашел бы постоянно расширяющееся регулярное выражение, раздражающее.

Пока я не обнаружил, что я был совершенно не прав в соответствии с @falsetru, я бы сделал это следующим образом:

%w[Bronze Silver Gold].any? { |s| name.start_with? s }

Я бы поставил массив слов в переменную или константу (или метод, я полагаю), хотя.

Затем я поместил логику в метод, независимо от того, что это такое с name, имя которого зависит от контекста. Это делает его тривиально проверяемым, расширяемым и инкапсулированным.

def precious_metal?
    self.name.starts_with? precious_metals
end

...

if precious_metal?
  # Some logic
end