2015-07-07 3 views
13

Esiste un modo per far corrispondere un intervallo intero? Sto cercando di estrarre i caratteri dopo un certo numero di caratteri e aggiungere un puntino di sospensione. Questo è quello che voglio fare, ma non corrisponde a 1..32.Corrispondenza caso nell'intervallo intero

def cutoff(title) do 
    case byte_size(title) do 
     _ -> title 
     1..32 -> String.slice(title, 1..32) <> " ..." 
    end 
end 

risposta

14

Ci sono 2 problemi qui:

  1. Quando pattern matching a Elixir (e Erlang) i modelli sono valutati cima a fondo. Nel tuo caso, hai una clausola catch all (la variabile ignorata _) sopra il tuo intervallo di numeri.
  2. Si sta verificando il valore per l'intervallo 1..32 - byte_size non restituirà un intervallo, verrà restituito un numero intero. Se si desidera verificare all'interno di un intervallo, è necessario utilizzare uno guard.

Se si scambia l'ordine delle partite e di utilizzare una guardia allora funzionerà:

def cutoff(title) do 
    case byte_size(title) do 
     x when x in 1..32 -> String.slice(title, 1..32) <> " ..." 
     _ -> title 
    end 
end 

Si consiglia inoltre di tagliare da 0 invece di 1 in modo che il primo carattere non viene tagliato off.