2015-10-26 21 views
5

Come abbinare e quale sintassi deve controllare byte_size uguale a 12 lunghezze in handle_info()? Posso usare entrambi i modelli in handle_info(), ad es. prima cosa verificherà la stringa per la nuova riga, la seconda con byte_size?Qual è la sintassi per byte_size nella corrispondenza del modello?

codice di esempio, senza byte_size modello:

def init(_) do 
    {:ok, []} 
end 

def handle_info({:elixir_serial, serial, "\n"}, state) do 
    {:noreply, Enum.reverse(state)} 
end 

def handle_info({:elixir_serial, serial, data}, state) do 
    Logger.debug "data: #{data}" 
    {:noreply, [data | state]} 
end 

risposta

4

Sì, è possibile utilizzare entrambi i modelli, questo è lo scopo di avere più clausole di funzione. Dall'alto verso il basso, verrà eseguita la prima clausola della funzione di corrispondenza.

È possibile utilizzare diversi modelli binari per abbinare 12 byte, a seconda di quale uscita è necessario:

iex> <<data::bytes-size(12)>> = "abcdefghijkl" 
"abcdefghijkl" 
iex> data 
"abcdefghijkl" 

iex> <<data::size(96)>> = "abcdefghijkl" 
"abcdefghijkl" 
iex> data 
30138990049255557934854335340 

Questi modelli possono ovviamente essere utilizzate nelle clausole di funzione:

def handle_info({:elixir_serial, serial, <<data::bytes-size(12)>>}, state) do 
    # ... 
end 

def handle_info({:elixir_serial, serial, <<data::size(96)>>}, state) do 
    # ... 
end 

Per ulteriori Informazioni su tipi e modificatori disponibili, è possibile consultare la documentazione della sintassi bitstring online o in iex digitando h <<>>.

Si potrebbe anche usare una clausola di guardia insieme a byte_size:

def handle_info({:elixir_serial, serial, data}, state) when byte_size(data) == 12 do 
    # ... 
end 
+0

Come posso concat stringhe in arrivo da: elixir_serial fino portata stato desiderato 12 di lunghezza? Attualmente non corrisponde, i dati nell'ultimo handle_info() contengono una stringa con lunghezza diversa. Ho provato con << state :: bytes-size (12) >>, ma anche l'output è sbagliato. – luzny

+0

Sto salvando i dati sul posto in cui si trova Logger.debug nel mio snippet di codice, è il posto giusto per gestire i dati corrispondenti? – luzny

+0

Sì, quello è il posto giusto. Se i dati sono di dimensioni variabili, non corrisponderebbero affatto alla lunghezza. –

Problemi correlati