2011-02-04 10 views

risposta

23

Forse non sapevi che si può mettere più condizioni su un singolo caso:

case mystr 
    when "abc", "def", "ghi", "xyz" 
    .. 
end 

Ma per questo specifico test di stringhe basata su , Vorrei usare regex:

if mystr =~ /\A(?:abc|def|ghi|xyz)\z/ 

Se non si desidera costruire un'espressione regolare, e si non vogliono una dichiarazione case, è possibile creare un array di oggetti e utilizzare Array#include? test per vedere se l'oggetto è nella matrice:

if [a,b,c,d].include?(o) 

o, per oggetto scimmia-patching, si può anche girare intorno :

class Object 
    def in?(*values) 
    values.include?(self) 
    end 
end 

if o.in?(a, b, c, d) 
+2

che cosa il?: Fare? (Google non ti permette di cercare simboli, e le tre guide in ruby ​​/ regex che ho cercato non hanno: per quanto posso dire) – jpwynn

+2

In una regex usi parentesi per limitare un'espressione e anche per catturarla per un uso successivo. In questo caso, in realtà non è necessario o vogliamo catturarlo, quindi mettere '?:' All'inizio delle parentesi è un'istruzione che non lo cattura. Vedi la [sintassi regex ufficiale Oniguruma] (http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt) per maggiori informazioni. – Phrogz

+0

perché ho completamente perso il terzo esempio che hai fornito, che era lo stesso del (eccellente/succinto) fornito da sepp2k. Fisso. È bello che tu abbia fornito diversi esempi, grazie. – jpwynn

12

È possibile utilizzare Array#include? come questo:

if ["abc", "def ", "ghi", "xyz"].include?(mystr) 
+6

e in questo caso specifico, vorrei utilizzare la matrice la sintassi letterale spazi delimitati per sbarazzarsi di citazioni tutte le virgole e: '% w [abc def ghi xyz] .include (mystr) ' –

3
>> mystr="abc" 
=> "abc" 
>> mystr[/\A(abc|def|ghi|xyz)\z/] 
=> "abc" 
>> mystr="abcd" 
=> "abcd" 
>> mystr[/\A(abc|def|ghi|xyz)\z/] 
=> nil 
Problemi correlati