5
一致する方法と確認する構文byte_size
は12の長さのパターンと同じですhandle_info()
? handle_info()
の両方のパターンを使用できますか?最初に新しい行の文字列をチェックし、2番目にbyte_size
と表示しますか? byte_size
パターン無しパターンマッチングのbyte_sizeの構文は何ですか?
例コード:
一致する方法と確認する構文byte_size
は12の長さのパターンと同じですhandle_info()
? handle_info()
の両方のパターンを使用できますか?最初に新しい行の文字列をチェックし、2番目にbyte_size
と表示しますか? byte_size
パターン無しパターンマッチングのbyte_sizeの構文は何ですか?
例コード:
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
は、どのように私からの着信文字列をCONCATことができますか?現在は一致しません。最後のhandle_info()のデータには、長さの異なる文字列が含まれています。 << state :: bytes-size(12)>>で試しましたが、出力も間違っています。 – luzny
私は自分のコードスニペットでLogger.debugの場所にデータを保存していますが、マッチしたデータを扱うのに適していますか? – luzny
はい、それは正しい場所です。データのサイズが可変であれば、長さはまったく一致しません。 –