2015-10-26 4 views
5

一致する方法と確認する構文byte_sizeは12の長さのパターンと同じですhandle_info()handle_info()の両方のパターンを使用できますか?最初に新しい行の文字列をチェックし、2番目にbyte_sizeと表示しますか? byte_sizeパターン無しパターンマッチングのbyte_sizeの構文は何ですか?

例コード:

答えて

4
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 

はい、両方のパターンを使用することができ、これは、複数の機能の節を有するの目的です。上から順に、最初に一致する関数節が実行されます。

あなたが必要とするどの出力に応じて、12バイトに一致するように別のバイナリパターンを使用することができます

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

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

これらのパターンはもちろん、あなたの関数句で使用することができます

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 

詳細は使用可能な型と修飾子に関する情報を参照するには、の文章、またはiexの文章を参照してください.h <<>>と入力してください。

またbyte_sizeと一緒にガード句を使用することができます状態のリーチは12の長さを希望するまでelixir_serial:

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

は、どのように私からの着信文字列をCONCATことができますか?現在は一致しません。最後のhandle_info()のデータには、長さの異なる文字列が含まれています。 << state :: bytes-size(12)>>で試しましたが、出力も間違っています。 – luzny

+0

私は自分のコードスニペットでLogger.debugの場所にデータを保存していますが、マッチしたデータを扱うのに適していますか? – luzny

+0

はい、それは正しい場所です。データのサイズが可変であれば、長さはまったく一致しません。 –

関連する問題