2015-01-22 11 views
11

Ho questo codicepassa più stringhe a ruby ​​starts_with?

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

C'è un modo per passare tutte queste stringhe in una volta, piuttosto che un sacco di o come io possa essere necessario espandere su questo?

risposta

19

String#start_with? accetta un numero arbitrario di argomenti. Non è necessario utilizzare ||.

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

Non ne avevo idea, e apparentemente è stato così visto che avrei dovuto saperlo meglio! –

+0

perfetto, non l'ho mai provato! –

1

No, start_with prende una stringa o espressioni regolari.

Troverò fastidiosa la regex in continua espansione.

Fino a quando ho scoperto che ero totally wrong as per @falsetru, avrei fatto in questo modo:

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

avevo messo l'array di parole in una variabile o costante (o un metodo, suppongo), però.

Quindi ho inserito la logica in un metodo su qualsiasi cosa sia con la proprietà name, il cui nome dipende dal contesto. Questo rende questo banalmente testabile, estensibile e incapsulato.

def precious_metal? 
    self.name.starts_with? precious_metals 
end 

... 

if precious_metal? 
    # Some logic 
end 
Problemi correlati